4

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

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

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

但是,它会因文件意外结束而出错。我要导入的表只是一个身份字段,后跟一个我想插入文本的 nvarchar 字段。如果我将文本文件“1”添加到每一行的开头,它工作正常,我认为这是因为 SQL 如果查找 2 个字段。有没有办法解决?

谢谢

4

7 回答 7

10

为此,您需要使用 FORMATFILE。请参阅批量插入

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.

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

于 2009-06-16T14:58:22.967 回答
2

这在 KEEPIDENTITY 参数下的 BULK INSERT 在线书籍中有描述。这是说的

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

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

于 2009-06-16T15:09:25.707 回答
1

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

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

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

BULK INSERT vw_SwearWords FROM 'c:\swearwords.txt' WITH (ROWTERMINATOR = '\n')
于 2009-06-16T14:57:19.160 回答
0

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

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

马克

于 2009-06-16T14:51:04.230 回答
0

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

于 2009-06-16T14:53:55.597 回答
0

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

于 2009-06-16T14:56:23.890 回答
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/

于 2012-06-27T04:54:11.953 回答