Поскольку ординальная позиция здесь действительно важна, тогда я предлагаю против 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;
дБ <> скрипка