从SQL Server NVARCHAR列中提取JSON值

时间:2019-01-30 22:07:49

标签: json sql-server sql-server-2016

我正在尝试提取值,但始终返回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

2 个答案:

答案 0 :(得分:3)

在我看来这是您的JSON表现不符合您预期的问题。

您的JSON是一个包含两个值idTest1idTest2 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