2009-06-16 92 views
4

我想导入一列文本文件到我的SQL表之一。该文件只是发誓词的列表。SQL Server大容量插入

我已经写了下面的TSQL做到这一点

BULK INSERT SwearWords 
FROM 'c:\swears.txt' 
WITH 
(
FIELDTERMINATOR = ',', 
ROWTERMINATOR = '\n' 
) 

然而,它的错误与文件的unexapected结束。 im导入到的表格只是一个标识字段,后跟一个我想插入文本的nvarchar字段。如果我在eveyr行的开头添加文本文件“1”,它工作正常,我假设这是因为SQL查找2个字段。有没有办法解决?

感谢

+0

你不想使用SSIS的任何原因? – zvolkov 2009-06-16 15:08:05

回答

10

您需要使用FORMATFILE这一点。见BULK INSERT

FORMATFILE [= 'format_file_path']

指定格式 文件的完整路径。格式文件描述数据 文件,其中包含使用在 相同的表或视图bcp实用工具 创建的存储的响应。格式文件 应的情况下被使用,其中:

* The data file contains greater or fewer columns than the table or view. 

* The columns are in a different order. 

* The column delimiters vary. 

* There are other changes in the data format. Format files are usually created by using the bcp utility and modified with a text editor as needed. For more information, see bcp Utility. 

有关详细信息,请参阅Using Format Files

0

你需要确保你的文本文件和表匹配的结构 - 如果表中有两个字段,那么你将不得不提供两个字段/列在文本文件中。

由于在SQL表中的第一列是标识字段,可以提供你想要的任何值 - 但你必须有一个值在那里,我不认为有解决这个办法。

马克

+0

这不是什么OP写的东西? – 2009-06-16 14:52:33

+0

本质上,是的 - 但OP似乎不知道为什么...... – RolandTumble 2009-06-16 17:31:04

0

检查的最后一行具有CR/LF(\ r \ n)中。有时候这就是问题,有时候在文件的末尾有一个额外的回车符。 你可以用hexeditor检查。

0

您可以删除标识列,并把它回来时,你就大功告成了。或者,如果这打破了您的数据库关系,那么您可以使用DTS或SSIS进行导入 - 如果是一次导入导入 - 更精细地控制列的摆弄

1

此外,您可以根据刚创建的视图nvarchar列,然后BULK INSERT到您的视图中。这是使用BULK INSERT的非常干净的方式。

这样,你不必担心你的IDENTITY列,或创建一个格式文件。

你BULK INSERT语句应该是这样的:

BULK INSERT vw_SwearWords FROM 'c:\swearwords.txt' WITH (ROWTERMINATOR = '\n') 
2

这在书籍KEEPIDENTITY参数下所述上行大容量插入。这里是说什么

KEEPIDENTITY 指定标识列的值存在于导入的文件中。如果未提供KEEPIDENTITY,则导入的数据文件中此列的标识值将被忽略,并且SQL Server将根据创建表时指定的种子值和增量值自动分配唯一值。如果数据文件不包含表或视图中标识列的值,请使用格式文件指定在导入数据时应跳过表或视图中的标识列; SQL Server自动为该列分配唯一值

所以,要么使用格式文件或提供一个虚拟的值,并确保不使用KEEPIDENTITY参数

0

在SQL Server 2008中,我发现它更容易只是创建一个包含了很多像这样的插入的文件,并粘贴到Management Studio中的查询窗口,而不是越来越格式文件和批量插入文件的权限正好打:

USE YourDB 
GO 
INSERT INTO MyTable (FirstCol, SecondCol) 
VALUES ('First',1), 
('Second',2), 
('Third',3), 
('Fourth',4), 
('Fifth',5) 

http://blog.sqlauthority.com/2008/07/02/sql-server-2008-insert-multiple-records-using-one-insert-statement-use-of-row-constructor/