SQL Server 2016:无法使用JSON_MODIFY引用JSON数组路径

时间:2017-07-10 23:40:29

标签: sql-server-2016

我已经尝试了几个小时来解决我的问题,但我没有成功。

我将一个复杂的JSON对象传递给存储过程,然后在插入主记录之后,我获取该新记录ID,并使用它来更改JSON对象中的其他一些ID。

我成功使用JSON_MODIFY,当这个值不在数组中时。

SET @json = JSON_MODIFY(@json, '$.Weather.RoundID', @round_identity) 

但是当值在数组中时,我似乎无法使其工作。

当我对路径的索引进行硬编码时,这是有效的:

SET @json = JSON_MODIFY(@json, '$.Scores[0].RoundID', @round_identity);

这不起作用:

SET @json = JSON_MODIFY(@json, '$.Scores['+ STR(@Score_Counter) + '].RoundID', @round_identity);

错误是:

  

" JSON_MODIFY"的参数2必须是字符串文字

@Score_Counter由while循环生成,用于索引当前数组对象。

任何帮助都将不胜感激。

谢谢

比尔

更新: 在Bogdan的帮助下,我能够成功地更改阵列中的json。 这是我正在使用的:

--Loop and populate all scores to set RoundID using Dynamic SQL
Set @Score_Counter = 0;
Set @Score_Count = (SELECT COUNT(*) FROM OPENJSON(@json, N'lax $.Scores'))

WHILE @Score_Counter < @Score_Count
BEGIN
    SELECT  @SqlStatement = CONCAT(N'SELECT @json = JSON_MODIFY    (@json, ''$.Scores[', @Score_Counter, N'].RoundID'', ' + cast(@round_identity as nvarchar(10))+')')
    EXEC    sp_executesql @SqlStatement, N'@json NVARCHAR(MAX) OUTPUT', @json = @json OUTPUT
    SET @Score_Counter = @Score_Counter + 1;
END;

1 个答案:

答案 0 :(得分:2)

[1]如果您想要一个简单/快速的解决方案将INT转换为VARCHAR,您可以使用LTRIM或[更好] CONVERT(VARCHAR(11), @int_var)

SET @json = JSON_MODIFY(@json, '$.Scores['+ LTRIM(@Score_Counter) + '].RoundID', @round_identity);

STR用于将FLOAT值格式化为字符串/ VARCHAR,并且还填充空格[在左侧]。

注意:如果我使用STR,我会收到以下错误:

Msg 13607, Level 16, State 4, Line 3
JSON path is not properly formatted. Unexpected character ' ' is found at position 8.

[2]看一下将最后一个对象(索引Prop2)的2从J 300更改为0的示例:

DECLARE @SqlStatement NVARCHAR(MAX)
DECLARE @j          NVARCHAR(MAX) = N'{"Array":[{"Prop1":"A","Prop2":123},{"Prop1":"B","Prop2":200},{"Prop1":"C","Prop2":300}]}'
DECLARE @i          INT = 2
DECLARE @json_path  NVARCHAR(128) = '$.Array[' + LTRIM(@i) + '].Prop2'

SELECT  @SqlStatement = CONCAT(N'SELECT @j = JSON_MODIFY(@j, ''$.Array[', @i, N'].Prop2'', 0)')
EXEC    sp_executesql @SqlStatement, N'@j NVARCHAR(MAX) OUTPUT', @j = @j OUTPUT
SELECT  @j AS TestMod

/*
TestMod
---------------------------------------------------------------------------------------
{"Array":[{"Prop1":"A","Prop2":123},{"Prop1":"B","Prop2":200},{"Prop1":"C","Prop2":0}]}
*/

[3]我将从源JSON中提取每个相关值,并将它们存储在不同的列中。