【问题标题】:How to create and populate a table in a single step as part of a CSV import operation?作为 CSV 导入操作的一部分,如何一步创建和填充表?
【发布时间】:2012-05-12 04:55:59
【问题描述】:

我正在寻找一种快速而简单的方法来将 CSV 文件导入 SQL Server,而无需事先创建表并定义其列

每个导入的 CSV 都会被导入到自己的表中。

我们不关心数据类型推断。 CSV 的结构和布局各不相同,它们都有很多列,但我们只关心其中的一小部分:街道地址和邮政编码。我们只想快速将 CSV 数据导入 SQL 数据库并提取相关列。

我想提供 FieldTerminator 和 RowTerminator,将其指向 CSV,然后让实用程序完成剩下的工作。有没有办法使用 BULK INSERT 和/或 OpenRowset(BULK ... ) 一步完成创建表并填充它?

【问题讨论】:

    标签: sql-server sql-server-2000 bulkinsert create-table openrowset


    【解决方案1】:

    Referencing SQLServerPedia,我认为这会起作用:

    sp_configure 'show advanced options', 1;
    RECONFIGURE;
    GO
    sp_configure 'Ad Hoc Distributed Queries', 1;
    RECONFIGURE;
    GO
    
    select TerritoryID
          ,TotalSales
          ,TotalCost
    INTO CSVImportTable
    from openrowset('MSDASQL'
                   ,'Driver={Microsoft Access Text Driver (*.txt, *.csv)}'
                   ,'select * from C:\csvtest.CSV')
    

    【讨论】:

    • 谢谢。我不得不使用 Microsoft 文本驱动程序而不是 Microsoft Access 文本驱动程序,但导入工作正常。但是我确实收到了此错误消息(尽管导入仍然有效):Msg 15123,Level 16,State 1,Procedure sp_configure,Line 79 配置选项“Ad Hoc Distributed Queries”不存在,或者它可能是一个高级选项.
    • 您必须先为高级选项运行“重新配置”,然后才能配置临时选项。在第一次 RECONFIGURE 之后应该有另一个 GO。我会重新编辑。
    【解决方案2】:

    烦人,我还没有代表点可以评论,所以我会根据 TyT 添加一个答案(那个句柄在所有格中看起来很糟糕,顺便说一句......)

    工作代码需要一个双“\”而不是一个,以避免“找不到文件”错误。而且您不必指定字段;它们将从文件的第一行推断出来:

    select *
    into   CsvImportTable
    from   openrowset(
               'MSDASQL',
               'Driver={Microsoft Access Text Driver (*.txt, *.csv)}',
               'select * from C:\\csvtestfile.csv')
    

    Access 驱动程序没有问题。

    更新:如果您在推断类型不正确时遇到问题,请在文件顶部插入几行,其中包含您在表中所需类型的数据,这样您就可以得到,比如 text -> VARCHAR 而不是 text-> INT,然后在导入后删除这些行。

    作为最后的结冰,向表中添加一个 PK,以便您可以操作数据 - 删除虚拟行等:

    alter table CsvImportTable add Id int identity(1, 1)
    

    【讨论】:

    • 为了它的价值,将详细信息添加到您的个人资料中。您的代表点数增加。
    【解决方案3】:

    如果您使用的是 SQL Server Management Studio 17,则更新答案。

    右键单击数据库 -> 任务 -> 导入平面文件...

    它会自动推断数据的第一行作为列名。它应该自动拾取终止符。您将获得设置主键、允许空值以及为列指定数据类型的选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多