JSON с CSV-массивом в SQL - PullRequest
0 голосов
/ 09 июля 2019

У меня есть следующая структура данных JSON, которую я получаю из API:

{"Data":"header1,header2,header3,header4\\n9datacolumn1,datacolumn2,datacolumn3,datacolumn4\\n9datacolumn1,datacolumn2,datacolumn3,datacolumn4"}

Как вы можете видеть, это в значительной степени CSV, с запятой в качестве разделителя и "\ n9"будучи разделителем строк / строк.

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

Я использую SQL Server 2017, поэтомуЯ могу использовать запросы JSON.Может ли кто-нибудь помочь мне с запросом вставить данные в таблицу SQL?

Большое спасибо!

1 Ответ

0 голосов
/ 09 июля 2019

Поскольку ординальная позиция здесь действительно важна, тогда я предлагаю против STRING_SPLIT, которая не имеет ни малейшего представления, что такое порядковая позиция.В результате я использую DelimitedSplit8k_LEAD, а предполагаю, что значение @JSON никогда не будет превышать 8000 символов (или 4000, если вы должны использовать DelimitedSplitN4K_LEAD):

DECLARE @JSON varchar(8000) = '{"Data":"header1,header2,header3,header4\\n9datacolumn1,datacolumn2,datacolumn3,datacolumn4\\n9datacolumn1,datacolumn2,datacolumn3,datacolumn4"}';

SELECT MAX(CASE DSc.ItemNumber WHEN 1 THEN DSc.Item END) AS Column1,
       MAX(CASE DSc.ItemNumber WHEN 2 THEN DSc.Item END) AS Column2,
       MAX(CASE DSc.ItemNumber WHEN 3 THEN DSc.Item END) AS Column3,
       MAX(CASE DSc.ItemNumber WHEN 4 THEN DSc.Item END) AS Column4--, --You get the idea now
       --MAX(CASE DSc.ItemNumber WHEN 1 THEN DSc.Item END) AS Column5,
       --MAX(CASE DSc.ItemNumber WHEN 1 THEN DSc.Item END) AS Column6
FROM OPENJSON(@JSON) OJ
     CROSS APPLY (VALUES(REPLACE(OJ.[value],'\n9','|')))V([value]) --If you do use a Pipe (|) in your data, use a different character
     CROSS APPLY dbo.DelimitedSplit8K_LEAD(V.[value],'|') DSr
     CROSS APPLY dbo.DelimitedSplit8K_LEAD(DSr.Item,',') DSc

--WHERE DSr.ItemNumber > 1 --Uncomment if you don't want the Header Row
GROUP BY DSr.ItemNumber
ORDER BY DSr.ItemNumber;

дБ <> скрипка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...