插入参数值和JSON字符串值

时间:2020-04-22 07:29:03

标签: sql json sql-server tsql

我试图创建一个存储过程,以通过JSONParameter插入数据

Declare @PaymentJson        Nvarchar(1000)  = N'{"type":4},{"type":1`},{"type":2},{"type":3}'  
        ,@ProductID         bigint  = 5
        ,@UserCode          bigint  = 2

Insert into PaymentType ([ProductID], [PaymentType],[UserCode])
            SELECT @ProductID,
                    PaymentType = MAX(CASE WHEN LOWER([key]) = 'type' THEN [value] END),
                    @UserCode
            FROM OPENJSON(@PaymentJson)

结果不正确,是第一个JSON(在这种情况下为4)行。

(受影响的1行)

我需要在这种情况下插入到行JSON中的PaymentType字符串的所需数量应该是:

(受影响的4行)

ProductID   PaymentType UserCode
5           4           2
5           1           2
5           2           2
5           3           2

我的DBMS是SQL Server 2019

2 个答案:

答案 0 :(得分:4)

此意外行为的原因是这样的事实,即输入JSON无效(多个根元素),但是OPENJSON()成功解析了该无效JSON中的第一个对象(尽管ISJSON()返回了{ {1}})。解决方法是,您需要将输入的JSON转换为有效的JSON数组,并使用0和具有适当列定义的显式架构进行解析:

OPENJSON()

答案 1 :(得分:1)

首先,您的JSON字符串无效,它必须是数组

N'[{"type":4},{"type":1},{"type":2},{"type":3}]'

第二,您无需在select语句中使用聚合函数

所以您的代码应如下所示:

Declare @PaymentJson        Nvarchar(1000)  = N'[{"type":4},{"type":1},{"type":2},{"type":3}]'  
        ,@ProductID         bigint  = 5
        ,@UserCode          bigint  = 2

Insert into PaymentType ([ProductID], [PaymentType],[UserCode])
            SELECT @ProductID,
                    PaymentType = (CASE WHEN LOWER([key]) = 'type' THEN [value] END),
                    @UserCode
            FROM OPENJSON(@PaymentJson)
相关问题