如何用显式模式映射openjson查询中的键?

如何用显式模式映射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$[

我有一个查询,它接受一个值序列的显式数组(比如100个数组)。 json看起来像这样

[["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我知道这可能是一个迟来的答案,但我用第二种解决方案解决了一个类似的问题。