Как получить подробный номер строки для строк в строке JSON - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть хранимая процедура, которая принимает строку NVARCHAR (max), представляющую собой данные JSON, которые мне нужно проверить перед загрузкой в ​​живые таблицы. Если проверка не пройдена, мне нужно вернуть сообщение с проблемой и номером строки неверных данных. У строк нет номера, назначенного в строке JSON, но это определяется порядком, в котором они хранятся в строке. Я пытаюсь присвоить добавочный номер во время функции OPENJSON.

При использовании XML я могу сделать это:

SELECT ROW_NUMBER() OVER (ORDER BY item) AS rowOrder 
     , item.value('(./Id/text())[1]', 'bigInt') AS EId
     , item.value('(./Name/text())[1]', 'nvarchar(255)') AS EName
     , item.value('(./Number/text())[1]', 'nvarchar(30)') AS ENumber
FROM @ERow.nodes('/variable/item') AS main(item);

чтобы получить его, но этот метод не работает с OPENJSON

Я бы предпочел не делать это в два прохода, если это возможно, т.е. загружать данные во временную таблицу и затем обновлять строки в временной таблице номером строки

SELECT ROW_NUMBER() OVER () AS rownum
     , newColumnName
     , decimal_column
     , nvarchar_column 
FROM OPENJSON(@JSON_String)
WITH (
    newColumnName BIGINT '$.id_column',
    decimal_column  DEC(28,8),
    nvarchar_column NVARCHAR(30)
)

Думал, что это сработает, но не повезло.

Хотелось бы закончить с таблицей вроде Sample Result Set

Ответы [ 2 ]

2 голосов
/ 16 апреля 2019

OPEN_JSON без предложения WITH вернет таблицу, содержащую столбцы key, value и type, где key - ключ массива (целое число) или объекта(строка).

Вы можете обработать value любым удобным вам способом:

SELECT j1.[key]
     , j2.*
     , JSON_VALUE(j1.[value], '$.nvarchar_column') AS [another example]
FROM OPENJSON('[
    {"id_column": 1234, "decimal_column": 12.34, "nvarchar_column": "asdf"},
    {"id_column": 5678, "decimal_column": 56.78, "nvarchar_column": "fdsa"}
]') AS j1
CROSS APPLY OPENJSON (j1.[value]) WITH (
    id_column BIGINT,
    decimal_column DEC(28, 8),
    nvarchar_column NVARCHAR(30)
) AS j2
1 голос
/ 16 апреля 2019

Я не думаю, что SQL Server имеет какую-либо опцию WITH ORDINAL для OPENJSON().

. Вы можете попробовать это:

SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rownum, 

ORDER BY требуется и(SELECT NULL) распознается как константа, поэтому на самом деле ничего не сортируется.На практике это должно возвращать результаты в порядке, возвращенном в JSON, но я не думаю, что это гарантировано.

...