SQL Server2008R2で実行しようとしているSQLServer2000で機能する一括挿入がありますが、期待どおりに機能していません。私はこれらの一括挿入をSQL2000に次のように正常に実行しています。
フォーマットファイル:
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.
フィールドターミネータをascii249(ù)からコンマ(、)に変更し、行ターミネータをascii 250(ú)からセミコロン(;)に変更すると、すべてが実行されます。ただし、これは実際にはオプションではなく(データには確かにそれらの文字が含まれます)、区切り文字に!@#$%^&*()のような任意の文字列を選択したくありません(さらにコードを編集する必要があります)そのように)。
コードページ、データファイルタイプ、照合、SQL互換レベル、フォーマットファイルバージョンのいくつかの組み合わせを試しましたが、役に立ちませんでした(これらすべてがどのように相互作用してここで何かを変更するかを知る専門知識があるわけではありません)。一括挿入MSDNドキュメントのさまざまな部分で、127より大きいまたは32より小さいASCII文字に関する特別な規則が参照されていますが、それが区切り文字にどのように影響するかを完全に理解することはできません。
できるだけ少ないコードに触れながら、新しいサーバーで実行できるようにするにはどうすればよいですか?
更新(解決策)
@Adam Wengerのコメントのおかげで、私は解決策を見つけました。データに拡張ASCII文字が含まれていることに対処するために、フォーマットファイルを使用せず、一括挿入データファイルをユニコード(ANSIではない)としてファイルシステムに書き込んでいます(データにユニコード文字が実際にはない場合でも) 。これが私の新しい一括挿入ステートメントです('widechar'に注意してください):
bulk insert Database1.dbo.Table1
from 'C:\DataFile.dat'
with (
check_constraints
, datafiletype = 'widechar'
, fieldterminator = 'ù'
, maxerrors = 0
, rowterminator = 'ú'
, tablock
)
何を試しても、拡張ASCII文字(127以上)で動作するフォーマットファイルを取得できませんでした。フォーマットファイルを削除し、インポートしていない列を表すためにデータファイルに追加のフィールド区切り文字を追加しました(これらの列にはデフォルトがあります)。