由于序数位置在这里非常重要,所以我建议反对STRING_SPLIT,它不知道序数位置是什么。结果我使用了DelimitedSplit8k_LEAD,并且假设@JSON 的值永远不会超过8,000 个字符(如果您要使用DelimitedSplitN4K_LEAD,则为4,000 个字符):
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;
db<>fiddle