T-SQL OPENJSON $ AS JSON无法工作。

3

有人能告诉我为什么第一个例子可以运行,但第二个不行吗?在我看来,它们应该是等价的...

DECLARE @prmInputData NVARCHAR(MAX) = '{ "a": { "b": 1, "c": 2 } }'

SELECT b, c, a
FROM OPENJSON(@prmInputData, '$')
WITH (
  b INT '$.a.b',
  c INT '$.a.c',
  a NVARCHAR(MAX) '$.a' AS JSON
)

SELECT b, c, a
FROM OPENJSON(@prmInputData, '$.a')
WITH (
  b INT '$.b',
  c INT '$.c',
  a NVARCHAR(MAX) '$' AS JSON
)

第一个示例正确地返回了 "a" 作为 JSON 对象。
第二个示例错误地返回了 NULL 作为 "a"。
我不确定原因!
1个回答

2

一个简单的区分方法是忽略WITH部分。

您的原始查询:

DECLARE @prmInputData NVARCHAR(MAX) = '{ "a": { "b": 1, "c": 2 } }';

SELECT *
FROM OPENJSON(@prmInputData, '$')
WITH (
  b INT '$.a.b',
  c INT '$.a.c',
  a NVARCHAR(MAX) '$.a' AS JSON
);

SELECT *
FROM OPENJSON(@prmInputData, '$.a')
WITH (
  b INT '$.b',
  c INT '$.c',
  a NVARCHAR(MAX) '$' AS JSON
);

输出:

╔═══╦═══╦════════════════════╗
║ b ║ c ║         a          ║
╠═══╬═══╬════════════════════╣
║ 1 ║ 2 ║ { "b": 1, "c": 2 } ║
╚═══╩═══╩════════════════════╝

 vs 

╔═══╦═══╦══════╗
║ b ║ c ║  a   ║
╠═══╬═══╬══════╣
║ 1 ║ 2 ║ NULL ║
╚═══╩═══╩══════╝

在移除了WITH之后:
DECLARE @prmInputData NVARCHAR(MAX) = '{ "a": { "b": 1, "c": 2 } }';

SELECT *
FROM OPENJSON(@prmInputData, '$');

SELECT *
FROM OPENJSON(@prmInputData, '$.a');

结果:

╔═════╦════════════════════╦══════╗
║ key ║       value        ║ type ║
╠═════╬════════════════════╬══════╣
║ a   ║ { "b": 1, "c": 2 } ║    5 ║      -- 5 ObjectValue
╚═════╩════════════════════╩══════╝

 vs

╔═════╦═══════╦══════╗
║ key ║ value ║ type ║
╠═════╬═══════╬══════╣
║ b   ║     1 ║    2 ║                   -- 2 IntValue
║ c   ║     2 ║    2 ║                   -- 2 IntValue
╚═════╩═══════╩══════╝

现在你可以检查路径如何表现,'$.a''$'之间的区别。
来自OPENJSON

如果您想从JSON属性返回嵌套的JSON片段,则必须提供AS JSON选项。 如果没有此选项,如果找不到属性,则OPENJSON返回NULL值,而不是引用的JSON对象或数组,或者在严格模式下返回运行时错误。

所以第二次尝试使用严格模式:
DECLARE @prmInputData NVARCHAR(MAX) = '{ "a": { "b": 1, "c": 2 } }';

SELECT *
FROM OPENJSON(@prmInputData, '$.a')
WITH  (
  b INT '$.b',
  c INT '$.c',
  a NVARCHAR(MAX) 'strict $' AS JSON
);

这将导致错误:

在指定的JSON路径上找不到属性。


啊,那很有趣,谢谢。那么,在同一个OPENJSON查询中,有没有办法选择我想要的多个层? - NightCabbage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接