3

我有一个查询,它需要一个明确数量的(比如说 100 个)值序列数组。json看起来像这样

[["horse",6],
 ...,
 ["dog",100]]

这些数组元素中的每一个都直接映射到其他一些表。虽然我可以执行以下操作来进行更新,但我更希望能够使用显式模式。

update some_table
set favorite_animal=convert(varchar(50),json_value(value,'strict $[0]'))
   ,favorite_number=convert(int,json_value(value,'strict $[1]'))
from openjson(@json)
where id = convert(int,[key])

不幸的是,当我使用显式模式时,我不确定如何指定当前路径( 中的值[key])。我真的很想我能做这样的事情,但我找不到语法:

from openjson(@json) 
with (favAnimal varchar(50) '$[0]',favNumber int '$[1]', row int '[key]')
4

1 回答 1

2

原答案:

下一种方法(一种可能的解决方案)是对具有索引的元素和嵌套 JSON 数组中的元素使用OPENJSON()两个额外的运算符。CROSS APPLY01

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

更新:

我认为即使这样也应该有效:

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
于 2019-05-01T16:50:14.327 回答