SQL Server大容量插入
我想导入一列文本文件到我的SQL表之一。该文件只是发誓词的列表。SQL Server大容量插入
我已经写了下面的TSQL做到这一点
BULK INSERT SwearWords
FROM 'c:\swears.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
然而,它的错误与文件的unexapected结束。 im导入到的表格只是一个标识字段,后跟一个我想插入文本的nvarchar字段。如果我在eveyr行的开头添加文本文件“1”,它工作正常,我假设这是因为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.
有关详细信息,请参阅Using Format Files。
你需要确保你的文本文件和表匹配的结构 - 如果表中有两个字段,那么你将不得不提供两个字段/列在文本文件中。
由于在SQL表中的第一列是标识字段,可以提供你想要的任何值 - 但你必须有一个值在那里,我不认为有解决这个办法。
马克
这不是什么OP写的东西? – 2009-06-16 14:52:33
本质上,是的 - 但OP似乎不知道为什么...... – RolandTumble 2009-06-16 17:31:04
检查的最后一行具有CR/LF(\ r \ n)中。有时候这就是问题,有时候在文件的末尾有一个额外的回车符。 你可以用hexeditor检查。
您可以删除标识列,并把它回来时,你就大功告成了。或者,如果这打破了您的数据库关系,那么您可以使用DTS或SSIS进行导入 - 如果是一次导入导入 - 更精细地控制列的摆弄
此外,您可以根据刚创建的视图nvarchar列,然后BULK INSERT到您的视图中。这是使用BULK INSERT的非常干净的方式。
这样,你不必担心你的IDENTITY列,或创建一个格式文件。
你BULK INSERT语句应该是这样的:
BULK INSERT vw_SwearWords FROM 'c:\swearwords.txt' WITH (ROWTERMINATOR = '\n')
这在书籍KEEPIDENTITY参数下所述上行大容量插入。这里是说什么
KEEPIDENTITY 指定标识列的值存在于导入的文件中。如果未提供KEEPIDENTITY,则导入的数据文件中此列的标识值将被忽略,并且SQL Server将根据创建表时指定的种子值和增量值自动分配唯一值。如果数据文件不包含表或视图中标识列的值,请使用格式文件指定在导入数据时应跳过表或视图中的标识列; SQL Server自动为该列分配唯一值
所以,要么使用格式文件或提供一个虚拟的值,并确保不使用KEEPIDENTITY参数
在SQL Server 2008中,我发现它更容易只是创建一个包含了很多像这样的插入的文件,并粘贴到Management Studio中的查询窗口,而不是越来越格式文件和批量插入文件的权限正好打:
USE YourDB
GO
INSERT INTO MyTable (FirstCol, SecondCol)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)
你不想使用SSIS的任何原因? – zvolkov 2009-06-16 15:08:05