如何创建和在一个单一的步骤为CSV导入操作的一部分填充表?(How to create and po

2019-06-24 02:54发布

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

每个导入CSV将被导入到自己的表。

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

我想提供FIELDTERMINATOR和ROWTERMINATOR,在CSV点它,并具有实用性做休息。 有什么办法来创建表,并填充它,只需一个步骤,使用BULK INSERT和/或OPENROWSET(BULK ...)?

Answer 1:

引用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')


Answer 2:

恼人的,我没有代表处点还只是发表评论,所以我会添加基于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?