【问题标题】:Insert rows into SQL Server table from json从 json 向 SQL Server 表中插入行
【发布时间】:2021-06-20 08:30:28
【问题描述】:

尝试创建一个存储过程以将 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 格式。我已经在 JSONLint 验证了 json

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

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

第三个错误是

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

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

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

【问题讨论】:

    标签: sql-server stored-procedures sql-server-json


    【解决方案1】:

    首先,如果您的数据库名称是动态的,则此处只需要动态 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 路径表达式。

    【讨论】:

      【解决方案2】:

      您有一些格式问题。

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

      【讨论】:

      • 你需要通过sp_executesql正确参数化@json,而QUOTENAME不需要额外的括号
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 2021-11-28
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多