简单 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)
我正在尝试创建一个简单的 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)