使用 WITH 时,如何获取 OPENJSON 中数组项的 "key"?

How do I get the "key" of an array item in OPENJSON, when using WITH?

我想在我的 sql-server 中解析一个 json-array。我想使用 OPENJSONWITH 将特定值解析为列。如何获取每个数组项的索引?

我知道,这适用于 JSON_VALUE 和没有 WITH:

DECLARE @json NVARCHAR(MAX) = '[{"name":"Alpha"},{"name":"Bravo"},{"name":"Charlie"}]'

SELECT [key], JSON_VALUE(value, '$.name')
FROM OPENJSON(@json)

--  key | value
----------------------------------
--    0 | Alpha
--    1 | Bravo
--    2 | Charlie

但是当我添加 WITH 时,我似乎无法再访问 key

SELECT [key], name
FROM OPENJSON(@json)
WITH (
  [key] INT, -- does not work
  name NVARCHAR(MAX)
)

--  key | name
----------------------------------
-- NULL | Alpha
-- NULL | Bravo
-- NULL | Charlie

您需要使用 OPENJSON() 和默认架构来获取每个数组项的键(作为您的第一次尝试)。文档中的注释 explains:

Note: The Key, Value, and Type columns are returned only when you use OPENJSON with the default schema and are not available with an explicit schema.

以下语句只是另一种获取密钥并使用显式模式解析 JSON 的选项:

DECLARE @json NVARCHAR(MAX) = '[{"name":"Alpha"},{"name":"Bravo"},{"name":"Charlie"}]';

SELECT j1.[key], j2.* 
FROM OPENJSON(@json) j1
CROSS APPLY OPENJSON (j1.[value]) WITH (name nvarchar(max)) j2

结果:

key name
---------
0   Alpha
1   Bravo
2   Charlie