0

我有一个可以在 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 兼容级别和格式文件版本的组合,但无济于事(并不是说我有专业知识知道所有这些将如何交互以更改此处的任何内容)。批量插入 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 个)。我只是摆脱了格式文件,现在将其他字段分隔符放在我的数据文件中,以表示我不导入的列(我在这些列上有默认值)。

4

1 回答 1

2

DATAFILETYPE='widechar'在您的块内指定WITH应该消除您对使用格式文件的需要,因为您可以在其中指定“widechar”字段和行终止WITHBULK INSERT。我参考了这篇关于 unicode character format for importing 数据的MSDN 文章。

BULK INSERT Database1.dbo.Table1
FROM 'C:\DataFile.dat'
WITH ( TABLOCK
   , CHECK_CONSTRAINTS
   , MAXERRORS = 0
   , DATAFILETYPE = 'widechar'
   , FIELDTERMINATOR = 'ù'
   , ROWTERMINATOR = 'ú'
)
于 2012-02-02T19:17:04.993 回答