Извлечение значений JSON из столбца NVARCHAR SQL Server - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь извлечь значения, но всегда возвращаю 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 голосов
/ 31 января 2019

Вы можете использовать опцию 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
0 голосов
/ 31 января 2019

Мне кажется, что проблема в том, что ваш JSON ведет себя не так, как вы ожидаете.

Ваш JSON - это массив , содержащий два значения idTest1 и idTest2.Ваш путь $.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 первого элемента в массиве.

Между прочим, если у вас включено строгое сопоставление путей, это привело бы к ошибке (как и должно быть) и могло бы помочь вам диагностироватьпроблема быстрее.

Рабочая скрипка здесь .

...