从 json 插入行到 SQL 服务器 table

Insert rows into SQL Server table from json

正在尝试创建一个存储过程以将 json 作为行插入到现有的空 table 中。 json 属性匹配 table 列。

此存储过程returns 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)

错误是

Msg 102, Level 15, State 1, Line 4
Incorrect syntax near 'Cutouts'.

我尝试遵循在 SQLShack. I've validated the json at JSONLint

的 sql 服务器中使用 json 示例中使用的 json 格式

The identifier that starts with ' { "ItemCode":"Circle", "MinutesLabor":8 ' is too long. Maximum length is 128.

我试过用 SET QUOTED_IDENTIFIER ONSET QUOTED_IDENTIFIER OFF 启动 sp,但在每种情况下都会抛出相同的错误

第三个错误是

Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.

The previous statement does end in a semi-colon

有许多示例展示了如何将 json 插入 SQL 服务器,我已尽我所能,但所有场景似乎都比我的复杂,但我仍然说不准。

您有一些格式问题。

首先,当您将 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 Fiddle

首先,如果你的数据库名称是动态的,你只需要动态SQL这里

假设是这种情况,那么正确的方法是通过 sp_executesql@json 作为参数传递给动态 SQL。另请注意,如果您使用 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 路径表达式。