最近、bcpでの作業中にエラーが発生しました。ここにエラーがあります。
SQLState = 22001、NativeError = 0エラー= [Microsoft] [SQL Server Native Client 10.0] String data、right truncation
制約のないステージングテーブルにデータをアンパックしようとしています。データと比較すると、データ型もかなり大きいです。さまざまなテーブルから約11個のファイルがbcpで圧縮されており、解凍時にエラーが1つしかありません。これは私がうまく使ってきたコマンドです。ごく最近(現在のWHのコピーを作成し、プロセスを設定するときに)問題に直面しています。
employee_details.datのbcp.exe employee_details -n -E -S "サーバー名" -U sa -P "パスワード"
コマンドを-C -T -Sに変更しようとしましたが、手動でフォーマットを指定したときに機能しました。これは、WHにロードする必要がある非常に大きく重要なパケットです。
フォーマットファイルがここにあるかどうかわかりません。どんな助けも必要です。
ありがとう
シナモンの女の子。
また、BCPの実行中に同じ問題に直面し、.datファイルの改行文字に関する問題であることが判明しました。
Notepad ++でファイルを表示し、[すべての文字を表示]をクリックして、改行文字を確認します。
BCPは-r "\ r\n"オプションを使用して、次のエラーをスローします。
bcp dbo.Test in C:\Test.dat -c -t "|" -r "\r\n" -S "DBServerName" -T -E
"SQLState = 22001、NativeError = 0 Error = [Microsoft] [SQL Server Native Client 10.0] String data、right truncation"
BCPは、ファイル内のすべての行を-r "\ n"または-r "\ r"オプションを使用して単一の行として扱います。つまり、以下のコマンドを使用します
bcp dbo.Test in C:\Test.dat -c -t "|" -r "\n" -S "DBServerName" -T -E
BCPコマンドで改行文字に16進値(0x0a)を使用したときに問題が解決されました
bcp dbo.Test in C:\Test.dat -c -t "|" -r "0x0a" -S "DBServerName" -T -E
私たちにとって、アップロードしようとしたファイルはANSI形式ではなくUnicode形式であることがわかりました。
-Nスイッチがありますが、テーブルにはNVARCHARデータがありませんでした。
ファイルをANSI形式で保存して動作しましたが、NVARCHARデータがある場合、または-Nスイッチを使用する必要がある場合があります。
TechNet-Unicode Native Formatを使用したデータのインポートまたはエクスポート を参照してください
bcpの右側の切り捨てエラーは、単一の列にフィットできるデータが多すぎる場合に発生します。これは、不適切なフォーマットファイル(使用されている場合)または区切り文字が原因である可能性があります。行末記号(WindowsにはCRLFまたは '\ r\n'があり、UNIXには '\ n'がある)もこのエラーを引き起こす可能性があります。例フォーマットファイルにWindows CRLFが含まれています。つまり、行終了記号として '\ r\n'が含まれていますが、ファイルには行末として '\ n'が含まれています。これは、ファイル全体を1行(むしろ1列)でフィッティングすることを意味し、これにより右切り捨てエラーが発生します。
切り捨てメッセージも表示されていました。何時間もフォーラムを検索し、提案された解決策を試した後、ようやく仕事に取り掛かりました。
切り捨てメッセージが表示されたのは、フォーマットファイルに列名を含めることが実際に重要であると考えるほど騙されたためです。これは、データがどこにロードされるかを決定するように見える前の数値です。
入力ファイルに、テーブルの3番目の列のデータがありませんでした。これが私のフォーマットファイルの見た目です。
... "," 1 Cust_Name SQL_Latin1...
... "," 2 Cust_Ref SQL_Latin1...
... "," 3 Cust_Amount SQL_Latin1...
... "\r\n" 4 Cust_notes SQL_Latin1...
私の入力ファイルは次のようになりました:
Jones,ABC123,200.67,New phone
Smith,XYZ564,10.23,New SIM
テーブルはこんな感じでした
Cust_Name Varchar(20)
Cust_Ref Varchar(10)
Cust_Type Varchar(3)
Cust_amount Decimal(10,2)
Cust_Notes Varchar (50)
Cust_Tel Varchar(15)
Cust......
フォーマットファイルの列名を指定することで、データがテーブルの適切な列に入ると想定しました。
ただし、これは列番号が重要であり、列名がノイズであるため機能します。
... "," 1 A SQL_Latin1...
... "," 2 B SQL_Latin1...
... "," 4 C SQL_Latin1...
... "\r\n" 5 D SQL_Latin1...
私の場合、その理由は、1つのフィールドに"|" = chr$(124)
が記述され、セパレータは私の場合"|" = chr$(179)
であったためです。
MS SQLは、両方の文字を区別しません。 chr$(124)
を削除すると、BCPによるインポートが正常に機能します。
Notepad ++でファイルを開きます。 [表示]タブに移動->記号を表示->すべての文字を表示。 .tsvファイルでも同じ問題が発生していました。1つのタブが間違って配置されていました。
4時間かけて大量の試行錯誤を繰り返した結果、データをインポートするテーブルと同じくらい簡単な解決策であることがわかりました。インポートしようとしているファイルに適したスキーマが必要です。例:私の場合。 667、aaa、bbbを含む.csvをint(4)、char(2)、char(2)のスキーマを持つテーブルにインポートすると、文字列が発生しますデータ、右トランケーション。
これは古いことを知っていますが、このエラーが発生するインスタンスに出くわしました。数値フィールドの1つに、スキーマで許可されているより多くの小数があることがわかりました。
遅いがそれでも:私の場合、私はこれを正確に手に入れた
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 11 for SQL Server]String data, right truncation
そして問題はスキーマが変更されたことでした。ターゲットデータベースには2つの新しいフィールドがありました。以前のスキーマをインストールしたら、インポートは成功しました。