简单 SQL 批量插入不起作用

Simple SQL Bulk Insert not working

我正在尝试创建一个简单的 Bulk Insert 命令来将固定宽度的文本文件导入 table。完成这项工作后,我将对其进行扩展以使我的更复杂的导入工作。

我目前收到错误...

Msg 4866, Level 16, State 7, Line 1
The bulk load failed. The column is too long in the data file for row 1, column 1. Verify that the field terminator and row terminator are specified correctly.

显然我已经检查了文件中的终止符。对于测试数据,我只是在记事本中键入了一个 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 上进行测试。

我哪里出错了?

能否请您尝试以下命令并检查 BULK 插入是否 happening.please 注意我添加了最后一行提到分隔符。

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 个字节:

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:非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 格式文件的设计存在错误。
与 Non-XML 格式文件不同,没有选项指示加载列的位置(名称只是为了脚本的清晰度,它们没有实际含义)。
文档中的 XML 示例 不起作用
Use a Format File to Skip a Table Column (SQL Server)