MS SQL Server 2016 с использованием методов JSON для получения значений - PullRequest
1 голос
/ 07 июня 2019

Возможно, это что-то глупое, чего я не видел, но мне не удается заставить работать JSON_VALUE или JSON_QUERY, так как я ожидаю, как это должно работать:

DECLARE @json nvarchar(max) = N'{"1031":"test-de","1033":"test-en","1036":"test-fr"}'

SELECT *
FROM OPENJSON(@json)

возвращает правильные 3 строки.

DECLARE @json nvarchar(max) = N'{"1031":"test-de","1033":"test-en","1036":"test-fr"}'
SELECT ISJSON(@json) is_json
  , JSON_VALUE(@json, '$') label
  , JSON_QUERY(@json, '$') label2

возвращает 1 строку, но label равно NULL, а label2 показывает всю строку. ОК, но:

DECLARE @json nvarchar(max) = N'{"1031":"test-de","1033":"test-en","1036":"test-fr"}'
SELECT ISJSON(@json) is_json
  , JSON_VALUE(@json, '$.1031') label
  , JSON_QUERY(@json, '$.1033') label2

возвращает 0 строк.

EDIT

Я ожидал получить такие результаты:

is_json, label, label2
1, test-de, test-en

1 Ответ

1 голос
/ 07 июня 2019

Поскольку ваш Ключ начинается с цифры, вам необходимо указать его. Я думаю , что вы ищете:

DECLARE @json nvarchar(max) = N'{"1031":"test-de","1033":"test-en","1036":"test-fr"}'

SELECT ISJSON(@json) AS is_json,
       JSON_VALUE(@json, '$."1031"') AS label,
       JSON_VALUE(@json, '$."1033"') AS label2;

В качестве альтернативы вы можете использовать WITH:

DECLARE @json nvarchar(max) = N'{"1031":"test-de","1033":"test-en","1036":"test-fr"}'

SELECT ISJSON(@json) is_json,
       J.label1,
       J.label2
FROM OPENJSON(@json)
     WITH (label1 varchar(7) '$."1031"',
           label2 varchar(7) '$."1033"') J;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...