我有一个在SQL Server 2000上运行的大容量插入,我正试图在SQL Server 2008 R2上运行,但它并没有像我希望的那样运行。我已经成功地在SQL 2000中运行了这些大容量插入,其中包括以下内容:
格式文件:
8.0
9
1 SQLCHAR 0 0 "ù" 1 Col1 ""
2 SQLCHAR 0 0 "ù" 2 Col2 ""
3 SQLCHAR 0 0 "ù" 3 Col3 ""
4 SQLCHAR 0 0 "ù" 4 Col4 ""
5 SQLCHAR 0 0 "ù" 5 Col5 ""
6 SQLCHAR 0 0 "ú" 6 Col6 ""
7 SQLCHAR 0 0 "" 0 Col7 ""
8 SQLCHAR 0 0 "" 0 Col8 ""
9 SQLCHAR 0 0 "" 0 Col9 ""
数据文件:
101ù110115100ùC02BCD72-083E-46EE-AA68-848F2F36DB4Dù0ù1ùCú
批量插入命令:
bulk insert Database1.dbo.Table1
from 'C:DataFile.dat'
with
(
formatfile = 'C:FormatFile.fmt'
, tablock
, check_constraints
, maxerrors = 0
)
现在我在SQL 2008 R2盒子上运行,我得到了以下错误:
Bulk load: An unexpected end of file was encountered in the data file.
如果我将字段终止符从ascii 249(Á)更改为逗号(,),并将行终止符从ascii 250(ú)更改为由分号(;),则一切都将运行。然而,这并不是一个真正的选项(数据中肯定会有这些字符),我不想选择一些任意的字符串,比如!@#$%^&()用于我的分隔符(必须以这种方式编辑更多代码)。
我尝试了一些代码页、数据文件类型、排序规则、sql-compat级别和格式文件版本的组合,但都没有用(并不是说我有专业知识知道所有这些将如何交互来更改这里的任何内容)。大容量插入MSDN文档的各个部分都提到了有关大于127或小于32的ascii字符的特殊规则,但我不太清楚这会对分隔符产生什么影响。
我能做些什么来接触尽可能少的代码,但让它在我的新服务器上运行?
更新(解决方案)
感谢@Adam Wenger的评论,我找到了解决方案。为了处理数据中包含扩展ASCII字符的问题,我不再使用格式化文件,而是将大容量插入数据文件作为unicode(而不是ANSI)写入文件系统(尽管我的数据中确实没有unicode字符)。这是我的新批量插入语句(注意"widechar"):
bulk insert Database1.dbo.Table1
from 'C:DataFile.dat'
with (
check_constraints
, datafiletype = 'widechar'
, fieldterminator = 'ù'
, maxerrors = 0
, rowterminator = 'ú'
, tablock
)
无论我尝试了什么,我都无法获得使用扩展ASCII字符(127以上)的格式文件。我只是去掉了格式文件,现在在数据文件中添加了额外的字段分隔符来表示我没有导入的列(我对这些列有默认值)。
在WITH
块中指定DATAFILETYPE='widechar'
应该可以通过在BULK INSERT
的WITH
中指定"widechar"字段和行终止符来消除使用格式文件的需要。我引用了MSDN上关于导入数据的unicode字符格式的文章。
BULK INSERT Database1.dbo.Table1
FROM 'C:DataFile.dat'
WITH ( TABLOCK
, CHECK_CONSTRAINTS
, MAXERRORS = 0
, DATAFILETYPE = 'widechar'
, FIELDTERMINATOR = 'ù'
, ROWTERMINATOR = 'ú'
)