SQL Server批量插入

时间:2009-06-16 14:47:14

标签: sql sql-server bulkinsert

我想将一个列文本文件导入到我的一个sql表中。该文件只是一个咒骂词的列表。

我已经编写了以下TSQL来执行此操作

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

然而,它与意外的文件结尾错误。导入到的表只是一个标识字段,后跟一个我要插入文本的nvarchar字段。如果我将文本文件“1”添加到eveyr行的开头,它可以正常工作,我认为这是因为SQL查找2个字段。有没有办法解决这个问题?

由于

7 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

这是在KEEPIDENTITY论证下的BULK INSERT在线书籍中描述的。这就是说什么

  

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

分配唯一值

因此,要么使用格式文件,要么提供虚拟值,并确保不使用KEEPIDENTITY参数

答案 2 :(得分:1)

此外,您可以仅基于nvarchar列在表上创建视图,然后将BULK INSERT创建到视图中。这是一种使用BULK INSERT的非常简洁的方式。

这样您就不必担心IDENTITY列或创建格式文件。

您的BULK INSERT语句应如下所示:

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

答案 3 :(得分:0)

您需要确保文本文件的结构和表格匹配 - 如果表格有两个字段,那么您还必须在文本文件中提供两个字段/列。

由于SQL表中的第一列是IDENTITY字段,您可以提供任何您想要的值 - 但是您必须在那里有一个值,我认为没有任何方法可以解决这个问题。

马克

答案 4 :(得分:0)

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

答案 5 :(得分:0)

您可以删除标识列,并在完成后将其放回原处。或者,如果这会破坏您的数据库关系,您可以使用DTS或SSIS进行导入,如果它是一次性导入 - 更精细地控制摆弄列

答案 6 :(得分: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/