我正在寻找一种快速而简单的方法将 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')
工作代码需要一个双“”而不是一个,以避免“文件未找到”错误。并且您不必指定字段;它们将从文件的第一行推断出来:
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)
如果您使用的是 SQL Server Management Studio 17,则更新答案。
右键单击数据库 -> 任务 -> 导入平面文件...
它会自动推断数据的第一行作为列名称。它应该自动拾取终结符。您将可以选择设置主键、允许空值以及指定列的数据类型。