0

试图建立一个存储过程以将 json 作为行插入到现有的空表中。json 属性与表列匹配。

此存储过程返回 3 个错误,如下所示

declare @json nvarchar(max)
declare @db_name sysname = 'test1'
set @json= N'{
"Cutouts":
[      
    {
        "ItemCode":"Circle",
        "MinutesLabor":8         
    },
    {
        "ItemCode":"Star",
        "MinutesLabor":10
    }   
]
}';
--print @json
declare @str nvarchar(max)

set @str = N'INSERT [' + QUOTENAME (@db_name) + '].[dbo].[Cutouts] (ItemCode, MinutesLabor)
SELECT ItemCode, MinutesLabor
FROM OPENJSON(' + @json + ')
     WITH (
     ItemCode varchar(8) ''$.Cutouts.ItemCode'', 
     MinutesLabor decimal(9,1) ''$.Cutouts.MinutesLabor''';
--print @str
exec (@str)

错误是

消息 102,级别 15,状态 1,第 4 行
'Cutouts' 附近的语法不正确。

我尝试遵循在SQLShack的 sql server 中使用 json 的示例中使用的 json 格式。我已经在J​​SONLint验证了 json

以 ' { "ItemCode":"Circle", "MinutesLabor":8 ' 开头的标识符太长。最大长度为 128。

我尝试使用 and 启动 sp,SET QUOTED_IDENTIFIER ON并且SET QUOTED_IDENTIFIER OFF在每种情况下都会引发相同的错误

第三个错误是

关键字“with”附近的语法不正确。如果此语句是公用表表达式、xmlnamespaces 子句或更改跟踪上下文子句,则前面的语句必须以分号结束。

前面的语句确实以分号结尾

有很多示例展示了如何将 json 插入 SQL Server,我已尽力遵循,但场景似乎都比我的复杂,但我仍然无法正确处理。

4

2 回答 2

1

首先,如果您的数据库名称是动态的,则此处只需要动态 SQL

假设是这种情况,那么正确的方法是@json作为参数传递给动态 SQL,通过sp_executesql. 另请注意,如果您使用QUOTENAME数据库名称,则不应在括号中。

declare @json nvarchar(max);
declare @db_name sysname = 'test1';
set @json= N'{
"Cutouts":
[      
    {
        "ItemCode":"Circle",
        "MinutesLabor":8         
    },
    {
        "ItemCode":"Star",
        "MinutesLabor":10
    }   
]
}'
--print @json
declare @sql nvarchar(max) = N'
INSERT ' + QUOTENAME(@db_name) + '.[dbo].[Cutouts] (ItemCode, MinutesLabor)
SELECT ItemCode, MinutesLabor
FROM OPENJSON(@json, ''$.Cutouts'')
     WITH (
     ItemCode varchar(8) ''$.ItemCode'', 
     MinutesLabor decimal(9,1) ''$.MinutesLabor'')';

--print @sql
exec sp_executesql @sql
  N'@json nvarchar(max)',
  @json = @json;

如果您使用的是 SQL Server 2017+,您还可以参数化 JSON 路径表达式。

于 2021-06-20T19:37:16.287 回答
0

您有一些格式问题。

首先,当您将 json 与 Sql 字符串连接时,它需要被引用;最后需要一个右括号,并且可以在 OpenJson 元素中定义 json 路径。以下作品:

declare @json nvarchar(max)
declare @db_name sysname = 'test1'
set @json= N'''{
"Cutouts":
[      
    {
        "ItemCode":"Circle",
        "MinutesLabor":8         
    },
    {
        "ItemCode":"Star",
        "MinutesLabor":10
    }   
]
}'',''$.Cutouts''';
--print @json
declare @str nvarchar(max)

set @str = N'INSERT [' + QUOTENAME (@db_name) + '].[dbo].[Cutouts] (ItemCode, MinutesLabor)
SELECT ItemCode, MinutesLabor
FROM OPENJSON(' + @json + ')
     WITH (
     ItemCode varchar(8) ''$.ItemCode'', 
     MinutesLabor decimal(9,1) ''$.MinutesLabor'')';
--print @str
exec (@str)

DB 小提琴

于 2021-06-20T08:58:03.233 回答