如何解决如何从 SQL SERVER 中的 JSON 中获取每个对象的值
DECLARE @json NVARCHAR(1000);
SELECT @json = N'
{
"nodeinid": 1345,"data": [
{
"nodenametext": "Plan for project","nodedesctext": "plan description for execution","nodetypecode": "PLN","statuscode": "IP","prioritycode": "NI","linkeditemid": 0,"linkeditemtypecode": "TSK","startdttm": "2021-07-15T09:53:47.9575771","duedttm": "2021-07-15T09:53:47.9575771","hidefromclientindc": "true","draftindc": "no","inworkspaceid": 5678,"parentnodeid": 0,"categorytext": [
{
"categoryid": 111,"categoryidname": "college"
},{
"categoryid": 222,"categoryidname": "office"
}
],"assigntotext": [
{
"workspaceid": 567,"roleid": 4545,"accesstypecode": "ass","mailurl": "saram@gmail"
},{
"workspaceid": 977,"roleid": 67,"mailurl": "sarfdam@gmail"
}
]
}
]
}
';
使用的查询:
SELECT JSON_Value (c.value,'$.nodeinid') as nodein_id,JSON_Value (P.Value,'$.workspaceid') as workspace_id,JSON_Value (p.value,'$.accesstypecode') as accesstype_code,JSON_Value (Q.value,'$.categoryid') as category_id,'$.categoryidname') as categoryid_name
FROM OPENJSON (@json,'$.data') as C
CROSS APPLY OPENJSON (C.Value,'$.assigntotext') as P
CROSS APPLY OPENJSON (C.Value,'$.categorytext') as Q;
预期样本输出:
workspace_id accesstype_code
567 ass
977 ass
结果:查询抛出以下错误
消息 13609,级别 16,状态 4,第 50 行
JSON 文本格式不正确。在位置 998 处发现了意外字符 '"'。
如果我保留任何一个对象(assigntotext、categorytext),它就可以正常工作。
请更正查询以获取行和列格式的值。"
解决方法
看来 nvarchar(1000)
还不够,输入的 JSON 被截断了。将 @json
变量的数据类型更改为 nvarchar(max)
。您也可以尝试使用以下方法解析输入 JSON:
DECLARE @json NVARCHAR(max);
SELECT @json = N'... JSON data ...'
SELECT j2.*
FROM OPENJSON(@json,'$.data') WITH (
assigntotext nvarchar(max) '$.assigntotext' AS JSON
) j1
OUTER APPLY OPENJSON(j1.assigntotext) WITH (
workspace_id int '$.workspaceid',accesstype_code varchar(10) '$.accesstypecode'
) j2
结果:
workspace_id accesstype_code
----------------------------
567 ass
977 ass
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。