如何在CSV导入操作中一步创建和填充表格?

Tim*_*Tim 17 sql-server bulkinsert sql-server-2000 create-table openrowset

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

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

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

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

小智 11

引用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')
Run Code Online (Sandbox Code Playgroud)


Ste*_*inq 8

很烦人,我还没有回复点只是评论,所以我会添加一个基于TyT的答案(处理看起来很糟糕的占有欲,顺便说一下......)

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

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

我没有Access驱动程序的问题.

更新:如果您对错误推断的类型有问题,请在文件顶部插入几行,并在表中输入您想要的类型的数据,这样您就得到了,比如text - > VARCHAR而不是text-> INT然后导入后删除这些行.

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

alter table CsvImportTable add Id int identity(1, 1)
Run Code Online (Sandbox Code Playgroud)