我正在尝试提取值,但始终返回NULL。
DECLARE @TestTable TABLE
(
JSON_Column NVARCHAR(MAX)
)
INSERT INTO @TestTable
VALUES
(
(SELECT 111111 AS idTest1, 222222 AS idTest2 FOR JSON PATH)
);
SELECT
JSON_Column,
JSON_VALUE(JSON_Column,'$.idTest1') AS idTest1,
JSON_VALUE(JSON_Column,'$.idTest2') AS idTest2
FROM @TestTable
结果:
[{"idTest1":111111,"idTest2":222222}] NULL NULL
预期:
[{"idTest1":111111,"idTest2":222222}] 111111 222222
答案 0 :(得分:3)
在我看来这是您的JSON表现不符合您预期的问题。
您的JSON是一个包含两个值idTest1
和idTest2
的 array 。您的路径$.idTest1
不起作用,因为值存在于数组条目内。查看JSON输出:
[{"idTest1":111111,"idTest2":222222}] -- The square brackets are a dead giveaway!
由于数组,您需要更改路径以将其 first 元素包括在内:
SELECT JSON_Column,
JSON_VALUE(JSON_Column,'$[0].idTest1') AS idTest1,
JSON_VALUE(JSON_Column,'$[0].idTest2') AS idTest2
FROM @TestTable
请注意,我已将路径更改为$[0].idTest1
。这将选择数组中第一个元素的idTest1
值。
顺便说一句,如果您启用了严格的路径匹配,这将给您一个错误(应有的错误),并可能有助于您更快地诊断问题。
有效的小提琴是here。
答案 1 :(得分:1)
您可以在WITHOUT_ARRAY_WRAPPER
子句上使用FOR JSON PATH
选项,如下所示:
DECLARE @TestTable TABLE
(
JSON_Column NVARCHAR(MAX)
);
INSERT INTO @TestTable
VALUES
(
(SELECT 111111 AS idTest1, 222222 AS idTest2
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER )
),
(
(SELECT 3333 AS idTest1, 44444 AS idTest2
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER )
);
SELECT
JSON_Column,
JSON_VALUE(JSON_Column,'$.idTest1') AS idTest1,
JSON_VALUE(JSON_Column,'$.idTest2') AS idTest2
FROM @TestTable
结果:
JSON_Column idTest1 idTest2
{"idTest1":111111,"idTest2":222222} 111111 222222
{"idTest1":3333,"idTest2":44444} 3333 44444