我正在尝试使用 SQL Server 中的 OPENJSON 从 JSON 文件构建规范化表。JSON 的格式如下:
{
"actions":[
{"action":"delete","table":"users","key":4}],
{"action":"update","table":"users","key":5,
"fields":[{"Name":"FirstName":,"OldValue":"X","NewValue":"Bob"},
{"Name":"LastName":,"OldValue":"Y","NewValue":"Dobbs"}]
}
我的目标是在动态 SQL 中使用这些条目来生成有效的查询:
UPDATE [users] SET [FirstName]='Bob',[LastName]='Dobbs' WHERE [key]=5
目前我正在使用这个 SQL:
SELECT * FROM OPENJSON(@json, '$.actions')
WITH (
[Action] varchar(25) '$.action',
[Table] varchar(25) '$.table',
[Key] varchar(25) '$.key',
[fields] nvarchar(MAX) AS JSON
)
这给了我有用的结果,例如:
update users 5 {"name":...
我最初的想法是使用字符串解析来分解字段中的数据,但现在我意识到这是个坏主意。我相信我可以从临时表中查询到 JSON 解析器并将其分解为行集,但我到处都找过了,找不到一个可以展示这一点的示例。
有人对如何处理长度不一的字段列表有什么建议吗?
看起来您需要
OUTER APPLY
分解STRING_AGG
并重新聚合该fields
属性。另请注意
sysname
对象和列名称。QUOTENAME
转义对象和列名,用于REPLACE
长字符串。INSERT
,但你应该能够适应这一点。db<>小提琴