フォーマットファイルのフィールドターミネータの問題

txt形式のデータファイルがあり、次のコマンドで一括挿入を使用してロードしていました。

Bulk insert [table1] FROM "data.txt" WITH ( FIELDTERMINATOR ="|", ROWTERMINATOR ="0x0a", ) 

コードは適切に機能します。ただし、一括挿入でフォーマットファイルを使用してファイルを読み込もうとしたときに、最後の行のフィールドターミネータを指定する際に問題が発生しました。

これが最後の行の指定です。フォーマットファイル:

21 SQLCHAR 0 20 "0x0a" 21 misc_costs SQL_Latin1_General_CP1_CI_AS 

ターミネータとして「0x0a」を使用すると、次のエラーが発生します:

行2、列1(var1)の一括読み込みデータ変換エラー(切り捨て)。

“\ n”を使用すると、データはロードされますが、「|」最後の列にも読み込まれます。たとえば、「0.5 |」を取得します「0.5」の代わりに。

“| \ n”、 “0x0a”、 “| 0x0a”、 “\ r \ n”は “|”

行2、列1(var1)の一括読み込みデータ変換エラー(切り捨て)。

I ” m sql-server 2016、windows 1064ビットを使用しています。

誰かがこれを手伝ってくれますか?助けてくれてありがとう!

ジェイソン

コメント

  • 'についていくつか質問したので、このページを見てください:sommarskog.se/bulkload.html
  • @sp_BlitzErik、返信ありがとうございます。この記事は非常に役立ち、MSDNサイトよりもはるかに多くの情報を提供します。4.1の例を読みながら、フィールドターミネータ" \ " \ r \ n "と混同しました、引用は本当に完全なメモです、それはタイプですか?
  • 私が正しく覚えていれば、それは'エスケープシーケンスです。 'さらに下の方に説明があります。

回答

Line Feed / Hexコードで丸一日苦労した後、私はついに私の問題がフォーマットファイルの欠落した列によって引き起こされていることに気づきました。データセットは私にとって新しいもので、実際には22行あるのに対し、21行あると思いました。そのため、sqlサーバーはデータファイルから最後の「|」をロードし続けました。

これは、Windowsとは異なる行ターミネータを使用してUNIXシステムからデータファイルをロードすることに関心がある他の人のためのリファレンスです。3つあります。メソッド:

  1. 一括挿入を使用して、行ターミネータを「0x0a」に設定します。
  2. フォーマットファイルを使用して、最後のフィールドのフィールドターミネータを「\ n」に設定します。 “。
  3. 関数Char(10)で動的sqlを使用して、改行(LF)をコマンド文字列に挿入してから、exec()コマンド文字列を挿入します。

これらの方法を試す前に、メモ帳を使用してすべての制御文字を表示し、テキストファイルで使用されている制御文字を確認してください。

これらの方法のいずれも機能しない場合は、行以外の問題が発生している可能性があります。フィード/行ターミネータ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です