在SQL Server批量插入中,如何为字段和行终止符使用更高的ASCII字符

时间:2012-01-31 21:38:16

标签: sql-server-2008-r2 ascii bulkinsert extended-ascii terminator

我有一个批量插入,适用于我试图在SQL Server 2008 R2上运行的SQL Server 2000,但它没有按照我的希望工作。我已经成功地将这些批量插入运行到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的评论,我找到了解决方案。为了处理我的数据中有extended 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以上)来处理格式文件。我只是摆脱了格式文件,现在将额外的字段分隔符放在我的数据文件中,以表示我没有导入的列(我在这些列上有默认值)。

1 个答案:

答案 0 :(得分:2)

DATAFILETYPE='widechar'块中指定WITH,可以通过在{WITH BULK INSERT中指定“widechar”字段和行终止符来消除使用格式文件的需要。 1}}。我在unicode字符格式上引用了这个MSDN article来导入数据。

BULK INSERT Database1.dbo.Table1
FROM 'C:\DataFile.dat'
WITH ( TABLOCK
   , CHECK_CONSTRAINTS
   , MAXERRORS = 0
   , DATAFILETYPE = 'widechar'
   , FIELDTERMINATOR = 'ù'
   , ROWTERMINATOR = 'ú'
)