我想导入一列文本文件到我的SQL表之一。 该文件仅仅是一个宣誓词列表。
我已经写了下面的TSQL做到这一点
BULK INSERT SwearWords
FROM 'c:\swears.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
然而,它与文件的unexapected结束错误。 表IM导入到只是一个标识字段,然后,我要插入的文本到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的一个非常干净的方式。
这样,您就不必担心您的身份列,或者创建一个格式文件。
你BULK INSERT语句应该是这样的:
BULK INSERT vw_SwearWords FROM 'c:\swearwords.txt' WITH (ROWTERMINATOR = '\n')
你需要确保你的文本文件和表匹配的结构 - 如果表中有两个字段,那么你将不得不提供两个字段/列在文本文件中。
由于在SQL表中的第一列是标识字段,可以提供你想要的任何值 - 但你必须有一个值在那里,我不认为有解决这个办法。
渣
检查的最后一行有CR / LF(\ r \ n)的。 有时候这就是问题,另外一些时候一个额外的回车是在文件的结尾。 您可以检查与16进制软件。
您可以删除标识列,并把它回来时,你就大功告成了。 另外,如果打破你的数据库关系,你可以做使用DTS或SSIS进口,如果它是一个曾经关闭的进口 - 与列摆弄的更精细的控制
在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/