SQLSERVER テーブルに毎日インポートしたいフラット (テキスト) ファイルがたくさんあります。今のところ、手順を実行している間、1 つのファイルをインポートしたいだけです。もちろん、これを行うために c# コードを書くことはできますが、これは正しい方法ではないと感じており、xml 形式のファイルで一括挿入のようなものを使用したいと考えています。
最初のサンプル ファイルは次のようになります (sample.dat):
Q RR201110010000000002000000000000232000
N X4201110010000000001500000000000160000
注: このファイルの 16 進ダンプは、各行が正確に改行文字で終了していることを示しています。
私の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="CharFixed" LENGTH="6"/>
<FIELD ID="2" xsi:type="CharFixed" LENGTH="2"/>
<FIELD ID="3" xsi:type="CharFixed" LENGTH="8"/>
<FIELD ID="4" xsi:type="CharFixed" LENGTH="14"/>
<FIELD ID="5" xsi:type="CharFixed" LENGTH="14"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="c1" xsi:type="SQLNCHAR"/>
<COLUMN SOURCE="2" NAME="c2" xsi:type="SQLNCHAR"/>
<COLUMN SOURCE="3" NAME="c3" xsi:type="SQLCHAR"/>
<COLUMN SOURCE="4" NAME="c4" xsi:type="SQLINT" />
<COLUMN SOURCE="5" NAME="c5" xsi:type="SQLINT" />
</ROW>
</BCPFORMAT>
私のクエリは次のようになります。
SET LANGUAGE us_english;
GO
SET DATEFORMAT ymd;
go
BULK INSERT
PROJ.dbo.Costs
FROM 'C:\somewhere\test01\SAMPLE.DAT'
WITH
(
DATAFILETYPE ='CHAR',
FORMATFILE='C:\somewhere\test01\TRANSLATE02.XML',
ERRORFILE='C:\somewhere\test01\ERRORS.TXT',
ROWTERMINATOR='\n'
)
GO
このスクリプトを実行すると、行 2 からオーバーフロー エラーが発生します (つまり、SQL テーブルには表示されませんが、行 1 は正しく変換されたように見えます)。エラー行 (行 2) は改行で始まります! もちろん、それでは 4 番目のフィールドがオーバーフローします。そのため、スクリプトは ROWTERMINATOR を理解していないようです。\r が表示されない場合に備えて、'\n'、'\r'、'\r\n'、'\n\r' を試しました。役立たず。
また、ROWTERMINATOR を使用した一括挿入 txt エラーに従って、わずかに異なる SQL コマンドを試みました 。
同じエラーが発生しました。
私が見逃しているものについて何か考えはありますか?
リクエストに応じて、sample.dat のマンジされた 16 進ダンプを次に示します。
000000: 41 20 20 20 20 20 XX XX 32 30 31 31 31 30 30 31 Q RR20111001
000010: 30 30 30 30 30 30 30 30 30 31 35 30 30 30 30 30 0000000001500000
000020: 30 30 30 30 30 30 31 35 30 30 30 30 0A ZZ 20 20 000000150000.N
000030: 20 20 20 XX XX 32 30 31 31 31 30 30 31 30 30 30 X420111001000
000040: 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 0000002000000000
000050: 30 30 30 32 33 32 30 30 30 0A ZZ 20 20 20 20 20 000232000.Y
XX と ZZ はマスクされている (実際のデータではない) ことに注意してください。これがあまり混乱しないことを願っています。
以下の私の解決策は機能しますが、この問題もここで議論されており、解決策は私にとってより良いようです(確認していませんが、次のファイルで試してみると思います)。 一括挿入行ターミネータの問題