从 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 ON
和 SET 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)
首先,如果你的数据库名称是动态的,你只需要动态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 路径表达式。
正在尝试创建一个存储过程以将 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 ON
和 SET 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)
首先,如果你的数据库名称是动态的,你只需要动态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 路径表达式。