简单的SQL批量插入不起作用

时间:2016-11-23 06:39:38

标签: sql-server tsql bulkinsert bcp sql-server-2008r2-express

我尝试创建一个简单的Bulk Insert命令,将固定宽度的文本文件导入表格。一旦我完成了这项工作,我就会对其进行扩展,以使我更复杂的导入工作。

我目前收到错误...

  

Msg 4866,Level 16,State 7,Line 1
  批量加载失败。第1行第1列的数据文件中的列太长。验证是否正确指定了字段终止符和行终止符。

显然我已经检查了文件中的终结符。对于测试数据,我只在记事本中输入了3行文本文件。在这个阶段,我只想尝试每行导入一列。我填充了前两行,所以每一行都是18个字符。

Test.txt的

This is line one  
This is line two  
This is line three

当我在Notepad ++中查看文件并打开所有字符时,我在每行的末尾看到CRLF,文件末尾没有空白行。

这是我使用的SQL:

USE [Strata]
GO
drop table VJR_Bulk_Staging

Create Table [dbo].[VJR_Bulk_Staging](
[rowid] int Identity(1,1) Primary Key,
[raw] [varchar](18) not null)

GO
Bulk Insert [VJR_Bulk_Staging] 
From 'c:\temp\aba\test.txt'
with (FormatFile='c:\temp\aba\test2.xml')

这是格式XML文件。我尝试了几种变体。这个是使用BCP命令创建的。

bcp strata.dbo.vjr_bulk_staging format nul -f test2.xml -x -n -T -S Server\Instance

这为我的rowid列创建了一个记录和行条目,我认为这是一个问题,因为它是一个标识字段,所以我删除了它。

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RECORD>
  <FIELD ID="1" xsi:type="CharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="18" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="raw" xsi:type="SQLVARYCHAR"/>
 </ROW>
</BCPFORMAT>

我在SQL Server 2008 R2 Express上进行测试。

我出错的任何想法?

3 个答案:

答案 0 :(得分:1)

我认为问题在于你的前缀是2个字节长:

xsi:type="CharPrefix" PREFIX_LENGTH="2"

根据您发布的内容,您的数据文件中没有前缀。在格式文件中将PREFIX_LENGTH设置为0,或在数据文件中提供正确的前缀。

您可以在文档中找到有关前缀数据类型以及前缀的更多信息:Specify Prefix Length in Data Files by Using bcp (SQL Server)

我认为您真正想要的是键入CharTerm并使用正确的TERMINATOR/r/n)。

答案 1 :(得分:0)

请问您可以尝试以下命令并检查BULK插件是否正在发生。请注意我已添加了提及分隔符的最后一行。

USE [Strata]
GO
drop table VJR_Bulk_Staging

Create Table [dbo].[VJR_Bulk_Staging](
[rowid] int Identity(1,1) Primary Key,
[raw] [varchar](18) not null)

GO
Bulk Insert [VJR_Bulk_Staging] 
From 'c:\temp\aba\test.txt'
WITH ( FIELDTERMINATOR ='\t', ROWTERMINATOR ='\n',FIRSTROW=1 )

答案 2 :(得分:0)

这样做。

选项1:非XML格式文件

9.0  
1
1 SQLCHAR 0 18 "\r\n" 2 raw SQL_Latin1_General_CP1_CI_AS

或只是

9.0  
1
1 SQLCHAR "" "" "\r\n" 2 "" ""

选项2:XML格式文件

丑陋无法解决

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RECORD>
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\r" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\n"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="2" xsi:type="SQLINT"/>
  <COLUMN SOURCE="1" xsi:type="SQLCHAR"/>  
 </ROW>
</BCPFORMAT>

P.S。
在我看来,XML格式文件的设计存在一个错误 与非XML格式文件不同,没有选项来指示已加载列的位置(名称只是为了清晰的脚本,它们没有真正意义)。
文档中的XML示例不工作
Use a Format File to Skip a Table Column (SQL Server)