作为 CSV 导入操作的一部分,如何一步创建并填充表?

问题描述 投票:0回答:3

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

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

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

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

sql-server sql-server-2000 bulkinsert create-table openrowset
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')

11
投票

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

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)

2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.