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

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

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

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

由于

有帮助吗?

解决方案

您需要使用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.

有关详细信息,请参阅使用格式文件

其他提示

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

  

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

分配唯一值

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

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

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

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

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

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

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

马克

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top