【问题标题】:Convert CSV stored in a string variable to table将存储在字符串变量中的 CSV 转换为表
【发布时间】:2019-08-10 02:59:07
【问题描述】:

我已将 CSV 数据存储在 SQL 中的字符串变量中:

@csvContent = 
'date;id;name;position;street;city
 19.03.2019  10:06:00;1;Max;President;Langestr. 35;Berlin
 19.04.2019  12:36:00;2;Bernd;Vice President;Haupstr. 40;Münster
 21.06.2019  14:30:00;3;Franziska;financial;Hofstr. 19;Frankfurt'

我想做的是将它转换为#table,所以它看起来像

SELECT * FROM #table

 date                 id  name   position       street        city
 ---------------------------------------------------------------------
 19.03.2019  10:06:00 1   Max    President      Langestr. 35  Berlin
 19.04.2019  12:36:00 2   Bernd  Vice President Haupstr. 40   Münster
 21.06.2019  14:30:00 3   Franzi financial      Hofstr. 19    Frankfurt

标题不固定,因此 CSV 可能有或多或少具有不同标题名称的列。

我用split_string()pivot 尝试过,但没有找到解决方案。

【问题讨论】:

  • 请标记您正在使用的 RDBMS。 SQL Server、Oracle、...?
  • 对不起,SQL Server 2017
  • 1.通过说“标题不固定”,您的意思是需要动态创建表吗? 2. 字符串变量是从哪里来的?——也就是说,是否存在一个潜在的问题,比如如何将 CSV 文件加载到表中?
  • 否,值来自使用字符串 (CSV) 的存储过程调用,无法进行 BULK INSERT。是的,表格必须是动态的,CSV 中可能有更多或更少的列

标签: sql string csv variables sql-server-2017


【解决方案1】:

如果您使用的是 SQL 服务器,这可能是您请求的解决方案:

How to split a comma-separated value to columns

【讨论】:

  • 我已经尝试过这些解决方案,但它们都依赖于固定数量的列标题,这在我的问题中并非如此
【解决方案2】:

希望对你有帮助

    CREATE TABLE #temp(
        date date,
        id int ,
        name varchar(100), 
       . ....... //create column that you needed
    )
DECLARE @sql NVARCHAR(4000) = 'BULK INSERT #temp
        FROM ''' + @CSVFILE+ ''' WITH 
        ( 
            FIELDTERMINATOR ='';'',
            ROWTERMINATOR =''\n'', 
            FIRSTROW = 2
         )';

        EXEC(@sql);

        SELECT *FROM #temp
        DROP TABLE #temp

【讨论】:

    猜你喜欢
    • 2019-09-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    相关资源
    最近更新 更多