繁体   English   中英

SQL 服务器批量插入

[英]SQL Server Bulk Insert

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

我写了以下 TSQL 来做到这一点

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

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

谢谢

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

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

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

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

因此,要么使用格式文件,要么提供一个虚拟值,并确保不使用 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)。 有时这就是问题所在,有时文件末尾有一个额外的回车符。 您可以使用十六进制编辑器进行检查。

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

在 SQL Server 2008 中,我发现更容易创建一个包含大量插入的文件,并将其粘贴到 Management Studio 的查询 window 中,而不是为获得格式文件和批量插入文件权限而斗争:

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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM