SELECT JSON_VALUE Из таблицы возвращает значение NULL вместо значения - PullRequest
0 голосов
/ 07 января 2019

JSON хранится в столбце «DataJson» в таблице

[{
    "KickOffDate": "1-Jan-2019",
    "TeamSize": "11",
    "ClientEngineer": "Sagar",
    "WaitingPeriod": "16.5"
}]

Запрос

SELECT JSON_VALUE(DataJson,'$.KickOffDate') AS KickOffDate
     , JSON_VALUE(DataJson,'$.ClientEngineer') AS ClientEngineer
FROM [ABC].[Deliver]

Результат

KickOffDate   ClientEngineer
NULL          NULL

Результат должен быть:

KickOffDate   ClientEngineer
1-Jan-2019    Sagar

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Ваш sql запрос неправильный.
Вы должны исправить запрос, как показано ниже.

 SELECT JSON_VALUE(DataJson,'$[0].KickOffDate') AS KickOffDate ,JSON_VALUE(DataJson,'$[0].ClientEngineer') AS ClientEngineer FROM [ABC].[Deliver]

Данные, хранящиеся в таблице, не являются объектом JSON, это массив JSON.
Таким образом, чтобы получить каждое значение объекта JSON, необходимо установить индекс объекта JSON в массиве JSON.
В противном случае вы можете сохранить данные как объект JSON, и тогда ваш запрос будет работать нормально.

0 голосов
/ 07 января 2019

Ваш JSON выглядит неправильно, по крайней мере, с точки зрения JSON API SQL Server. Из того, что я прочитал, если ваши данные JSON состоят из массива JSON верхнего уровня, то массив должен иметь имя ключа, а также все содержимое должно быть заключено в { ... }.

Следующая установка была протестирована и работает:

WITH yourTable AS (
    SELECT '{ "data" : [{"KickOffDate": "1-Jan-2019", "TeamSize": "11", "ClientEngineer": "Sagar", "WaitingPeriod": "16.5"}] }' AS DataJson
)

SELECT
    JSON_VALUE(DataJson, '$.data[0].KickOffDate') AS KickOffDate,
    JSON_VALUE(DataJson, '$.data[0].ClientEngineer') AS ClientEngineer
FROM yourTable;

enter image description here

Демо

Вот как выглядит входной JSON, который я использовал:

{
    "data" : [
        {
            "KickOffDate": "1-Jan-2019",
            "TeamSize": "11",
            "ClientEngineer": "Sagar",
            "WaitingPeriod": "16.5"
        }
    ]
}
...