我想将一个列文本文件导入到我的一个sql表中。该文件只是一个咒骂词的列表。
我已经编写了以下TSQL来执行此操作
BULK INSERT SwearWords
FROM 'c:\swears.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
然而,它与意外的文件结尾错误。导入到的表只是一个标识字段,后跟一个我要插入文本的nvarchar字段。如果我将文本文件“1”添加到eveyr行的开头,它可以正常工作,我认为这是因为SQL查找2个字段。有没有办法解决这个问题?
由于
答案 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)