如何用显式模式映射openjson查询中的键?
我有一个查询,它接受一个值序列的显式数组(比如100个数组)。 json看起来像这样如何用显式模式映射openjson查询中的键?,json,sql-server,sql-server-json,Json,Sql Server,Sql Server Json,我有一个查询,它接受一个值序列的显式数组(比如100个数组)。 json看起来像这样 [["horse",6], ..., ["dog",100]] 这些数组元素中的每一个都直接映射到另一个表。虽然我可以执行以下操作来进行更新,但我更希望能够使用显式模式 更新一些表 设置favorite_animal=convert(varchar(50),json_值(value,'strict$[0]')) ,favorite_number=convert(int,json_值(值,'strict$[
[["horse",6],
...,
["dog",100]]
这些数组元素中的每一个都直接映射到另一个表。虽然我可以执行以下操作来进行更新,但我更希望能够使用显式模式
更新一些表
设置favorite_animal=convert(varchar(50),json_值(value,'strict$[0]'))
,favorite_number=convert(int,json_值(值,'strict$[1]'))
来自openjson(@json)
其中id=convert(int,[key])
不幸的是,当我使用显式模式时,我不确定如何指定当前路径([key]
中的值)。
我真的很想做这样的事情,但我找不到语法:
from openjson(@json)
with (favAnimal varchar(50) '$[0]',favNumber int '$[1]', row int '[key]')
原始答案: 下一种方法是使用
OPENJSON()
和两个额外的交叉应用
操作符,从嵌套的JSON数组中为索引为0
和1
的元素使用
T-SQL:
DECLARE @json nvarchar(max)
SET @json = N'[["horse",6],["cat",10],["dog",100]]'
SELECT
(j.[key] + 1) AS row,
j1.[value] AS favAnimal,
j2.[value] AS favNumber
FROM OPENJSON(@json) j
CROSS APPLY OPENJSON(j.[value]) j1
CROSS APPLY OPENJSON(j.[value]) j2
WHERE (j1.[key] = 0) AND (j2.[key] = 1)
结果:
-------------------------
row favAnimal favNumber
-------------------------
1 horse 6
2 cat 10
3 dog 100
-------------------------
row favAnimal favNumber
-------------------------
1 horse 6
2 cat 10
3 dog 100
更新:
我认为,即使这样也应该奏效:
DECLARE @json nvarchar(max)
SET @json = N'[["horse",6],["cat",10],["dog",100]]'
SELECT
(j1.[key] + 1) AS [row],
j2.*
FROM OPENJSON(@json) j1
CROSS APPLY OPENJSON(CONCAT(N'[', j1.[value], N']')) WITH (
favAnimal nvarchar(50) '$[0]',
favNumber int '$[1]'
) j2
结果:
-------------------------
row favAnimal favNumber
-------------------------
1 horse 6
2 cat 10
3 dog 100
-------------------------
row favAnimal favNumber
-------------------------
1 horse 6
2 cat 10
3 dog 100
后者可以工作,但没有给我所需要的索引器。我对前者的性能提出质疑。@MichaelB我知道这可能是一个迟来的答案,但我用第二种解决方案解决了一个类似的问题。