18

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

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

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

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

4

3 回答 3

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')
于 2012-05-02T20:18:56.320 回答
11

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

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

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)
于 2016-02-02T18:20:21.803 回答
1

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

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

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

于 2019-09-25T21:43:49.933 回答