我在寻找一个快速和肮脏的方式导入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')
我曾与Access驱动程序没有问题。
更新:如果你有同类型被错误地推断出麻烦,在与你在表格中你得到想要的类型的数据文件的顶部插入几行,说文本 - 的> VARCHAR而不是文本 - > INT,然后在导入后删除这些行。
作为最后结冰,一PK添加到表中,以便您可以操纵数据 - 删除虚拟行等:
alter table CsvImportTable add Id int identity(1, 1)
文章来源: How to create and populate a table in a single step as part of a CSV import operation?