我尝试创建一个简单的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上进行测试。
我出错的任何想法?
答案 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)
这样做。
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 "" ""
丑陋无法解决
<?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)