【问题标题】:JSON with CSV array to SQL带有 CSV 数组的 JSON 到 SQL
【发布时间】:2019-07-09 15:53:37
【问题描述】:

我有以下从 API 获取的 JSON 数据结构:

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

如您所见,这几乎是一个 CSV,逗号是分隔符,“\n9”是换行符/行分隔符。

我把这个json字符串传给一个存储过程,这个存储过程应该把数据插入一个表中。

我使用的是 SQL Server 2017,因此我可以使用 JSON 查询。谁能帮我查询将数据插入到 SQL 表中?

非常感谢!

【问题讨论】:

    标签: sql json sql-server stored-procedures sql-server-2017


    【解决方案1】:

    由于序数位置在这里非常重要,所以我建议反对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

    【讨论】:

    • 太棒了!谢谢拉努。有没有办法让 header1、header2 等作为列名而不是 column1、column2?
    • 不是没有动态 SQL @ImperialBert
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2021-02-25
    相关资源
    最近更新 更多