Arrays 在T-SQL中更新/添加json数组的属性

Arrays 在T-SQL中更新/添加json数组的属性,arrays,json,sql-server,Arrays,Json,Sql Server,我看到的所有处理json数组的方法都将数组嵌套在顶级对象下。我在一列中有一个json数组: [{key:value1},{key:value2}] 我想运行sql脚本为数组中的每个元素添加/更新一个键,从而产生: [{key:value1,otherKey:otherValue},{key:value,otherKey:otherValue}] 是的,在我的例子中,我希望为每个数组成员设置相同的值。我试过: declare @info nvarchar(max) SET @info = '[{

我看到的所有处理json数组的方法都将数组嵌套在顶级对象下。我在一列中有一个json数组: [{key:value1},{key:value2}]

我想运行sql脚本为数组中的每个元素添加/更新一个键,从而产生: [{key:value1,otherKey:otherValue},{key:value,otherKey:otherValue}]

是的,在我的例子中,我希望为每个数组成员设置相同的值。我试过:

declare @info nvarchar(max)
SET @info  = '[{"key": "value1"}, {"key": "value2"}]'
print JSON_MODIFY(@info, '[0].otherKey', '""')
并且由于JSON路径格式不正确而失败。在位置0处发现意外字符“[”

这是在MSSQL 2017中。

您是否尝试过在索引器符号前添加$?例如:

declare @info nvarchar(max)
SET @info  = '[{"key": "value1"}, {"key": "value2"}]'
SELECT JSON_MODIFY(@info, '$[0].otherKey', '""')
这将提供以下输出:

[{"key": "value1","otherKey":"\"\""}, {"key": "value2"}]
您是否尝试过在索引器符号之前添加$?例如:

declare @info nvarchar(max)
SET @info  = '[{"key": "value1"}, {"key": "value2"}]'
SELECT JSON_MODIFY(@info, '$[0].otherKey', '""')
这将提供以下输出:

[{"key": "value1","otherKey":"\"\""}, {"key": "value2"}]

可以使用的方法取决于JSON结构,我假设JSON数组中的项目计数不是固定的:

如果输入JSON数组包含带有固定键的items JSON对象,则可以使用OPENJSON与显式模式的组合,将此JSON解析为表,并使用JSON修改并返回JSON行 如果输入JSON有不同结构的项,您可以使用OPENJSON与默认模式、JSON_MODIFY和STRING_AGG的组合。 JSON:

固定结构声明:

SELECT @info = (
   SELECT [key], 'OtherValue' AS OtherKey
   FROM OPENJSON(@info) WITH ([key] varchar(100) '$.key')
   FOR JSON PATH
)
SELECT @info = CONCAT('[', STRING_AGG(JSON_MODIFY([value], '$.OtherKey', 'OtherValue'), ','), ']')
FROM OPENJSON(@info)
SELECT @info
变量结构的声明:

SELECT @info = (
   SELECT [key], 'OtherValue' AS OtherKey
   FROM OPENJSON(@info) WITH ([key] varchar(100) '$.key')
   FOR JSON PATH
)
SELECT @info = CONCAT('[', STRING_AGG(JSON_MODIFY([value], '$.OtherKey', 'OtherValue'), ','), ']')
FROM OPENJSON(@info)
SELECT @info
结果:

[{"key":"value1","OtherKey":"OtherValue"},{"key":"value2","OtherKey":"OtherValue"}]

请注意,此错误的原因是路径参数[0]的值错误。otherKey错误。正确的路径表达式为$[0]。JSON数组中第一个项的otherKey。

可以使用的方法取决于JSON结构,我假设JSON数组中的项计数不固定:

如果输入JSON数组包含带有固定键的items JSON对象,则可以使用OPENJSON与显式模式的组合,将此JSON解析为表,并使用JSON修改并返回JSON行 如果输入JSON有不同结构的项,您可以使用OPENJSON与默认模式、JSON_MODIFY和STRING_AGG的组合。 JSON:

固定结构声明:

SELECT @info = (
   SELECT [key], 'OtherValue' AS OtherKey
   FROM OPENJSON(@info) WITH ([key] varchar(100) '$.key')
   FOR JSON PATH
)
SELECT @info = CONCAT('[', STRING_AGG(JSON_MODIFY([value], '$.OtherKey', 'OtherValue'), ','), ']')
FROM OPENJSON(@info)
SELECT @info
变量结构的声明:

SELECT @info = (
   SELECT [key], 'OtherValue' AS OtherKey
   FROM OPENJSON(@info) WITH ([key] varchar(100) '$.key')
   FOR JSON PATH
)
SELECT @info = CONCAT('[', STRING_AGG(JSON_MODIFY([value], '$.OtherKey', 'OtherValue'), ','), ']')
FROM OPENJSON(@info)
SELECT @info
结果:

[{"key":"value1","OtherKey":"OtherValue"},{"key":"value2","OtherKey":"OtherValue"}]
请注意,错误的原因是路径参数[0]的值错误。otherKey错误。正确的路径表达式为$[0]。JSON数组中第一项的otherKey