TSQL更新
问题描述:
我被困在更新/插入来自JSON数组行到SQL Server 2017TSQL更新
我有以下结构:
{
"ID":52,
"Name":"Mark",
"Surname":"Blake",
"Age": 24
"Cars":[
{"ID":110,"Volvo":"2001-10-01","Color":"red"},
{"ID":110,"Volvo":"2001-10-01","Color":"red"},
{"ID":110,"Volvo":"2001-10-01","Color":"red"},
{"ID":-1,"Volvo":"2001-10-01","Color":"red"},
{"ID":-1,"Volvo":"2001-10-01","Color":"red"},
]
}
我试图做一个合并基础上Cars数组,当ID为-1时插入到表中,否则更新。
如何实现这一目标?
好的,我做到了,但我又遇到了另一个问题。 我想从更高的层次也得到ID(我的意思是52在这种情况下),它应该是这样的:
110 52 2001-10-01 red
110 52 2001-10-01 red
110 52 2001-10-01 red
-1 52 2001-10-01 red
-1 52 2001-10-01 red
答
我定你JSON,这是一个有点不正确。
DECLARE @json nvarchar(max) = '{
"ID":52,
"Name":"Mark",
"Surname":"Blake",
"Age": 24,
"Cars":[
{"ID":110,"Volvo":"2001-10-01","Color":"red"},
{"ID":110,"Volvo":"2001-10-01","Color":"red"},
{"ID":110,"Volvo":"2001-10-01","Color":"red"},
{"ID":-1,"Volvo":"2001-10-01","Color":"red"},
{"ID":-1,"Volvo":"2001-10-01","Color":"red"}
]
}'
SELECT JSON_VALUE(t.[value], N'$.ID'),
JSON_VALUE(t.[value], N'$.Volvo'),
JSON_VALUE(t.[value], N'$.Color')
FROM OPENJSON(@json, N'$.Cars') as t
输出:
110 2001-10-01 red
110 2001-10-01 red
110 2001-10-01 red
-1 2001-10-01 red
-1 2001-10-01 red
将在CTE或临时表,然后合并主表。或者你可以先INSERT(WHERE ID = -1
)和UPDATE(WHERE ID != -1
)
更新:
SELECT f.[value],
JSON_VALUE(c.[value], N'$.ID'),
JSON_VALUE(c.[value], N'$.Volvo'),
JSON_VALUE(c.[value], N'$.Color')
FROM OPENJSON(@json) f
CROSS APPLY OPENJSON(@json,N'$.Cars') c
WHERE f.[key] IN ('ID')
输出:
52 110 2001-10-01 red
52 110 2001-10-01 red
52 110 2001-10-01 red
52 -1 2001-10-01 red
52 -1 2001-10-01 red
我也用同样的只是几分钟前,但我我们遇到了另一个问题。 我想从更高级别(我的意思是52在这种情况下)的ID,它应该看起来像: 110 52 2001-10-01红色 110 52 2001-10-01红色 110 52 2001- 10-01红色 -1 52 2001-10-01红色 -1 52 2001-10-01红色 – tylkonachwile
你知道如何做到这一点吗?我编辑了我的帖子。感谢帮助! – tylkonachwile
如果你的JSON不会超过1个数据区,你可以简单地添加'JSON_VALUE(@ json,N'$ .ID')' – gofr1