Вставьте значения параметров и JSON строковые значения - PullRequest
2 голосов
/ 22 апреля 2020

Я попытался создать хранимую процедуру для вставки данных по JSON и Parameter

Declare @PaymentJson        Nvarchar(1000)  = N'{"type":4},{"type":1`},{"type":2},{"type":3}'  
        ,@ProductID         bigint  = 5
        ,@UserCode          bigint  = 2

Insert into PaymentType ([ProductID], [PaymentType],[UserCode])
            SELECT @ProductID,
                    PaymentType = MAX(CASE WHEN LOWER([key]) = 'type' THEN [value] END),
                    @UserCode
            FROM OPENJSON(@PaymentJson)

Результат не соответствует действительности, это 1 первая JSON (в данном случае тип равен 4) строка .

(затрагивается 1 строка)

Мне нужно, необходимое количество строк JSON, вставьте в строку PaymentType, в этом случае должно быть:

(затронуто 4 строки)

ProductID   PaymentType UserCode
5           4           2
5           1           2
5           2           2
5           3           2

Моя СУБД SQL Сервер 2019

Ответы [ 2 ]

3 голосов
/ 22 апреля 2020

Причиной такого неожиданного поведения является тот факт, что ввод JSON недопустим (несколько элементов root), но OPENJSON() успешно анализирует первый объект из этого недопустимого JSON (хотя ISJSON() возвращает 0). В качестве обходного пути вам нужно преобразовать входные данные JSON в действительный массив JSON и проанализировать его с OPENJSON() и явной схемой с соответствующим определением столбца:

DECLARE 
   @PaymentJson nvarchar(1000) = N'{"type":4},{"type":1},{"type":2},{"type":3}',
   @ProductID bigint = 5,
   @UserCode bigint = 2

INSERT INTO PaymentType ([ProductID], [PaymentType], [UserCode])
SELECT 
   @ProductID,
   [Type],
   @UserCode
FROM OPENJSON(CONCAT('[', @PaymentJson, ']')) WITH ([Type] int '$.type')
1 голос
/ 22 апреля 2020

Прежде всего, ваша строка JSON недопустима, это должен быть массив

N'[{"type":4},{"type":1},{"type":2},{"type":3}]'

секунда, вам не нужно использовать статистическую функцию в операторе выбора

поэтому ваш код должен быть таким:

Declare @PaymentJson        Nvarchar(1000)  = N'[{"type":4},{"type":1},{"type":2},{"type":3}]'  
        ,@ProductID         bigint  = 5
        ,@UserCode          bigint  = 2

Insert into PaymentType ([ProductID], [PaymentType],[UserCode])
            SELECT @ProductID,
                    PaymentType = (CASE WHEN LOWER([key]) = 'type' THEN [value] END),
                    @UserCode
            FROM OPENJSON(@PaymentJson)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...