我有一个存储过程,它接受一个 JSON 字符串作为输入参数。输入的 JSON 字符串是这样的:
[
{
"name":"Jhon",
"surname":"Smith",
"skills":["C#","VB.NET"]
},
{
"name":"Robert",
"surname":"Jhonson",
"skills":["T-SQL","Pascal"]
}
]
如何自动为每个主体对象添加唯一的 GUID
属性?
最佳答案
查看您已经发现的示例数据this page介绍如何使用 json_modify()
函数插入值的文档。该页面上的示例是为单个“主要对象”编写的。
如果我对此的解释正确,那么您的示例有 2 个主要对象。使用another page文档的一部分显示了如何使用 openjson()
函数将该示例分成几行。然后,您可以在每一行的第一个文档页面中应用 json_modify()
。
declare @var nvarchar(max) =
'[
{
"name":"Jhon",
"surname":"Smith",
"skills":["C#","VB.NET"]
},
{
"name":"Robert",
"surname":"Jhonson",
"skills":["T-SQL","Pascal"]
}
]';
select row_number() over(order by (select null)) as ObjNumber,
json_modify(j.value, '$.guid', convert(nvarchar(100), newid())) as ObjValue
from openjson(@var, '$') j
结果是这样的:
ObjNumber ObjValue
----------- ----------------------------------------------------
1 {
"name":"Jhon",
"surname":"Smith",
"skills":["C#","VB.NET"]
,"guid":"154C5581-588C-41AA-B292-BB6459F8F4DC"}
2 {
"name":"Robert",
"surname":"Jhonson",
"skills":["T-SQL","Pascal"]
,"guid":"46ACFDD6-58DE-4DB0-8D7A-9B1CCABFF8D8"}
Fiddle
要将行重新组合在一起,只需添加 for json path
。然而,这确实需要在输出中结束的字段别名(此处为 MyObjects
)。
select json_modify(j.value, '$.guid', convert(nvarchar(100), newid())) as MyObjects
from openjson(@var, '$') j
for json path;
输出:
[{"MyObjects":{
"name":"Jhon",
"surname":"Smith",
"skills":["C#","VB.NET"]
,"guid":"FCED4D30-B2B0-460B-97FA-EDA820039572"}},{"MyObjects":{
"name":"Robert",
"surname":"Jhonson",
"skills":["T-SQL","Pascal"]
,"guid":"9FF02A70-0455-4E5C-8C11-27BB2688929D"}}]
Fiddle
要更新变量,请使用以下代码。奖励:replace()
删除了之前添加的字段别名。
set @var = replace(
( select json_modify(j.value, '$.guid', convert(nvarchar(100), newid())) as MyObjects
from openjson(@var, '$') j
for json path ),
'"MyObjects":', '');
select @var
的最终输出:
[{{
"name":"Jhon",
"surname":"Smith",
"skills":["C#","VB.NET"]
,"guid":"66CB37D3-FAEF-4186-94D8-8AC0CF6EB1AC"}},{{
"name":"Robert",
"surname":"Jhonson",
"skills":["T-SQL","Pascal"]
,"guid":"564D6904-D981-40AC-BA9C-8B06015ACE50"}}]
Fiddle
https://stackoverflow.com/questions/63753186/
相关文章:
reactjs - Jest 测试因 gatsby webpack 配置而抛出错误
apache-spark - 有什么方法可以使用 spark 从 s3 并行读取多个 Parquet
api - Google Scripts 应用程序和 Plaid 链接身份验证
reactjs - reactstrap Collapse 没有出现在手机上
python - 如何找到 DataFrame 行的所有组合?
c - 尝试将 'insert' 或 'add' 写入文本文件 - 一个小问题
ios - 使用共享的 iOS Keychain 启用跨应用程序 Firebase 身份验证