如何在 CSV 导入操作过程中通过单个步骤创建和填充表



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

每个导入的 CSV 都将导入到其自己的表中。

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

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

参考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')

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

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

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

我对访问驱动程序没有任何问题。

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

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

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

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

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

它将自动推断数据的第一行作为列名。它应该自动拾取终结器。您可以选择设置主键、允许空值以及为列指定数据类型。

最新更新