我试图创建一个存储过程,以通过JSON
和Parameter
插入数据
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
答案 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)