【发布时间】:2019-07-23 22:11:32
【问题描述】:
我正在尝试使用 T-SQL 将特定的有效 JSON 字符串从列解析为其各个值。
我查看了很多样本,尤其是这个Parse JSON in TSQL,但仍然不完全在那里。谁能建议一个有效的 T-SQL 语句来完成这项工作?
MessageDetail 列中带有 json 的示例 cte:
select Id, MessageDetail from cte_example
Id MessageDetail
1 {"@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", "sysadmins": {"sysadmin": {"Member": "DummyAdmin", "IsDisabled": "0", "IsNTGroup": "0", "Added": "2019-07-22T18:10:55.023", "Removed": "2019-07-22T19:21:15.867"}}}
我正在尝试使用的 T-SQL:
select
json_value(b.value, '$.Member') as Member
,json_value(b.value, '$.IsDisabled') as IsDisabled
,json_value(b.value, '$.IsNTGroup') as IsNTGroup
,json_value(b.value, '$.Added') as Added
,json_value(b.value, '$.Removed') as Removed
from
cte_example a
outer apply openjson(json_query(a.MessageDetail, '$.sysadmins.sysadmin')) b
这会导致以下错误:
消息 13609,第 16 级,状态 2,第 17 行 JSON 文本格式不正确。在位置 0 发现意外字符“D”。
由于 JSON 查询 $.sysadmins.sysadmin 是有效的,我感到很困惑。我做错了什么?
注意:当它尝试解析以下内容时,我的查询工作正常
{"@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", "sysadmins": {"sysadmin": [{"Member": "sa", "IsDisabled": "0", "IsNTGroup": "0", "Added": "2019-07-19T03:01:49.677"}, {"Member": "testuser", "IsDisabled": "0", "IsNTGroup": "0", "Added": "2019-07-19T03:01:49.677"}, {"Member": "abc\\User1", "IsDisabled": "0", "IsNTGroup": "0", "Added": "2019-07-19T03:01:49.677"}, {"Member": "NT SERVICE\\SQLWriter", "IsDisabled": "0", "IsNTGroup": "0", "Added": "2019-07-19T03:01:49.677"}, {"Member": "NT SERVICE\\Winmgmt", "IsDisabled": "0", "IsNTGroup": "0", "Added": "2019-07-19T03:01:49.677"}, {"Member": "NT Service\\MSSQLSERVER", "IsDisabled": "0", "IsNTGroup": "0", "Added": "2019-07-19T03:01:49.677"}, {"Member": "NT SERVICE\\SQLSERVERAGENT", "IsDisabled": "0", "IsNTGroup": "0", "Added": "2019-07-19T03:01:49.677"}, {"Member": "DummyAdmin", "IsDisabled": "0", "IsNTGroup": "0", "Added": "2019-07-22T02:10:07.833", "Removed": "2019-07-22T03:00:02.177"}, {"Member": "domain1\\testservice", "IsDisabled": "0", "IsNTGroup": "0", "Added": "2019-07-19T04:18:51.900"}, {"Member": "##MS_PolicyEventProcessingLogin##", "IsDisabled": "1", "IsNTGroup": "0", "Added": "2019-07-22T04:07:48.497"}]}}
【问题讨论】:
-
您的 JSON 示例是不同的结构。您的第一个 sysadmin 不是阵列,但您列出的第二个 sysadmin 是阵列?是哪一个,因为tsql代码会不一样?
-
您的第一个错误的原因是因为在这种情况下,由于 sysadmin 不是数组,因此您在 b.value 中获得的值不是有效的 JSON,因此 json_value 会引发错误。您的第二个示例 sysadmin 是一个数组,因此您在 b.value 中获得了一个有效的 json 并且 json_value 可以遍历它。
-
是的,我现在看到了。我想现在我意识到我不能用同一个查询来解析两者。我很可能需要看看我是否也可以将“奇异”JSON 字符串做成一个数组?
-
顺便说一句:“JSON”是相当明显的笨拙转换的 XML,现在不再需要
xsi属性。 SQL Server 还对存储和解析 XML 提供了出色的支持,因此这里可能有机会减少转换步骤。
标签: json sql-server tsql