我已经尝试了几个小时来解决我的问题,但我没有成功。
我将一个复杂的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;
答案 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中提取每个相关值,并将它们存储在不同的列中。