use [tempdb] declare @JSON nvarchar(max) set @JSON=N'{ "id": "WakefieldFamily", "parents": [ { "familyName": "Wakefield", "givenName": "Robin" }, { "familyName": "Miller", "givenName": "Ben" } ], "children": [ { "familyName": "Merriam", "givenName": "Jesse", "gender": "female", "grade": 1, "pets": [ { "givenName": "Goofy" }, { "givenName": "Shadow" } ] }, { "familyName": "Miller", "givenName": "Lisa", "gender": "female", "grade": 8 } ], "address": { "state": "NY", "county": "Manhattan", "city": "NY" }, "creationDate": 1431620462, "isRegistered": false }' --此 JSON 文档包含嵌套的复杂元素,存储在下面的示例表中: --CREATE TABLE Families ( -- id int identity constraint PK_JSON_ID primary key, -- doc nvarchar(max) --) --insert into Families(doc) select @JSON SELECT * FROM Families WHERE ISJSON(doc) > 0 --使用 JSON_VALUE 函数从 JSON 文本中提取值 SELECT JSON_VALUE(f.doc, '$.id') AS Name, JSON_VALUE(f.doc, '$.address.city') AS City, JSON_VALUE(f.doc, '$.address.county') AS County FROM Families f WHERE JSON_VALUE(f.doc, '$.id') = N'WakefieldFamily' ORDER BY JSON_VALUE(f.doc, '$.address.city') DESC, JSON_VALUE(f.doc, '$.address.state') ASC --WakefieldFamily NY Manhattan --使用 JSON_QUERY 函数从 JSON 文本中提取对象或数组 SELECT JSON_QUERY(f.doc, '$.address') AS Address, JSON_QUERY(f.doc, '$.parents') AS Parents, JSON_QUERY(f.doc, '$.parents[0]') AS Parent0 FROM Families f WHERE JSON_VALUE(f.doc, '$.id') = N'WakefieldFamily' --分析嵌套式 JSON 集合 SELECT JSON_VALUE(f.doc, '$.id') AS Name, JSON_VALUE(f.doc, '$.address.city') AS City, c.givenName, c.grade FROM Families f CROSS APPLY OPENJSON(f.doc, '$.children') WITH(grade int, givenName nvarchar(100)) c --查询嵌套式分层 JSON 子数组 SELECT familyName, c.givenName AS childGivenName, c.firstName AS childFirstName, p.givenName AS petName FROM Families f CROSS APPLY OPENJSON(f.doc) WITH (familyName nvarchar(100), children nvarchar(max) AS JSON) CROSS APPLY OPENJSON(children) WITH (givenName nvarchar(100), firstName nvarchar(100), pets nvarchar(max) AS JSON) as c OUTER APPLY OPENJSON (pets) WITH (givenName nvarchar(100)) as p --JSON_VALUE 和 JSON_QUERY 之间的主要区别在于 JSON_VALUE 返回标量值,而 JSON_QUERY 返回数组或对象。 --use [AdventureWorks] --修改 JSON 对象 DECLARE @info NVARCHAR(100)='{"name":"John","skills":["C#","SQL"]}' PRINT @info -- Update skills array SET @info=JSON_MODIFY(@info,'$.skills',JSON_QUERY('["C#","T-SQL","Azure"]')) PRINT @info --修改 JSON 对象 DECLARE @RespData NVARCHAR(max)=N'{"code": "000","message": "成功","data": {"secretKey": "","content": "{\"rule_result\":{\"risk_level\":\"\",\"reason_code\":[],\"hitted_rules\":[]}}"}}' declare @content NVARCHAR(max)=JSON_VALUE(@RespData,'$.data.content') SET @content=JSON_MODIFY(@content,'$.rule_result.hitted_rules',JSON_QUERY(N'[{"name":"ZZC_CRS0027","description":"申请人最近7天到30天在网贷机构出现过","rule_type":"跨机构比对","risk_level":"M"}]')) SET @RespData=JSON_MODIFY(@RespData,'$.data.content',@content) --select @content,@RespData select JSON_VALUE(@RespData,'$.code'),JSON_VALUE(@RespData,'$.message'),JSON_VALUE(@RespData,'$.data.content'),JSON_VALUE(JSON_VALUE(@RespData,'$.data.content'),'$.rule_result.hitted_rules[0].name') --https://learn.microsoft.com/zh-cn/sql/t-sql/functions/json-value-transact-sql?view=sql-server-ver16 --drop table [Families] --Test DECLARE @JSONText NVARCHAR(MAX); SET @JSONText = '{"info": {"address": [{"town": "Belgrade"}, {"town": "Paris"}, {"town":"Madrid"}]}}'; SELECT @JSONText SET @JSONText = JSON_MODIFY(@json, '$.info.address[1].town', 'London'); SET @JSONText = JSON_MODIFY(@json, 'append $.info.address', N'{"town":"BeiJing"}'); SELECT @JSONText
标签:--,doc,VALUE,Server,content,JSON,SQL,givenName From: https://www.cnblogs.com/hofmann/p/17671725.html