Один из параметров JSON out является нулевым значением - PullRequest
0 голосов
/ 24 марта 2020

У меня есть хранимая процедура для получения json строки. но мой результат имел значение NULL для Price. Ниже вы можете проверить это:

Declare @json nvarchar(4000) = N'{"productid":3,"startdate":"2020-01-05","Price":12.00,"unittype":10,"flag":1}'

DROP TABLE IF EXISTS #PriceTemp 
if ISJSON(@json) > 0

    SELECT * into #PriceTemp 
    FROM OPENJSON(@json)
    With (  ProductID   int         '$.productid'
            ,StartDate  date        '$.startdate'
            ,Price      money       '$.price'
            ,UnitType   bigint      '$.unittype'    
            ,Flag       int         '$.flag'
        )
Select * from #PriceTemp

Результат:

enter image description here

Что не так?

1 Ответ

2 голосов
/ 24 марта 2020

Когда вы используете OPENJSON() с явным определением схемы, синтаксис для определений столбцов чувствителен к регистру. Вам нужно использовать $.Price в вашей явной схеме:

SELECT * into #PriceTemp 
FROM OPENJSON(@json
WITH (  
   ProductID   int         '$.productid'
   ,StartDate  date        '$.startdate'
   ,Price      money       '$.Price'
   ,UnitType   bigint      '$.unittype'    
   ,Flag       int         '$.flag'
)

Если вы не уверены в использовании заглавных букв первого символа на входе JSON, одним из возможных решений является использование OPENJSON() со схемой по умолчанию и агрегацией. Обратите внимание, что в этом случае OPENJSON() возвращает таблицу со столбцами key, value и type, а тип данных для столбца value равен nvarchar(max).

SELECT 
   productid = MAX(CASE WHEN LOWER([key]) = 'productid' THEN [value] END),
   startdate = MAX(CASE WHEN LOWER([key]) = 'startdate' THEN [value] END),
   price = MAX(CASE WHEN LOWER([key]) = 'price' THEN [value] END),
   unittype = MAX(CASE WHEN LOWER([key]) = 'unittype' THEN [value] END),
   flag = MAX(CASE WHEN LOWER([key]) = 'flag' THEN [value] END)
FROM OPENJSON(@json)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...