2

SQL ServerのBULK INSERTタスクを使用してデータのインポートを何百回も実行しましたが、今回はなじみのないエラーが表示され、Googleで役に立たないトラブルシューティングを試みました。以下は、新しい行が改行文字で示されるコンマ区切りファイルで使用するコードです。

BULK INSERT MyTable
FROM 'C:\myflatfile.txt'
WITH (
    FIELDTERMINATOR = ','
    ,ROWTERMINATOR = '/n')
GO

一貫して機能しますが、日付とレートが設定された単純なファイルでは、「メッセージ4863、レベル16、状態1、行1のバルクロードデータ変換エラー(切り捨て)」のエラーで失敗します。行1、列2(ColumnTwo )。」ファイルを見ると、なぜこれが失敗するのかわかりません(通常、Googleのトラブルシューティングでは、区切り文字が1行に複数回存在する可能性があり、このエラーが発生する可能性があります)。ファイルから、最初の10行を次に示します(最初の行で失敗することに注意してください)。

1961-01-01,8.2
1961-02-01,8.2
1961-03-01,7.4
1961-04-01,7.6
1961-05-01,7.8
1961-06-01,8.5
1961-07-01,9.1
1961-08-01,8.8
1961-09-01,8.4
1961-10-01,8.8

これらのデータを挿入しているテーブルには2つのフィールドがありますがVARCHAR(50)、最初に切り捨てを確認したときにデータフィールドを展開しましたが、VARCHAR(2000)影響はありませんでした。

CREATE TABLE MyTable (
    ColumnOne VARCHAR(50),
    ColumnTwo VARCHAR(50)
)

また、すべてのダッシュを削除して、それが問題を引き起こしていないかどうかを確認しようとしました(これと同じコードを使用してダッシュで多くのデータインポートを実行し、エラーなしで機能しますが)、それでも同じエラーメッセージを受け取りました。

直接インポートは(を介してTasks)SSISと同じように機能しますが、まったく同じことを実行する必要があるため、このコードは失敗しますか?

4

2 に答える 2

12

問題は、ファイル形式が原因で行ターミネータが機能していない可能性があります。

試す:

ROWTERMINATOR = '0x0a'

編集

実際、私はあなたがスラッシュを使用していることに気づきました、それはバックスラッシュでなければならないので、これはうまくいくかもしれません:

ROWTERMINATOR = '\n'
于 2013-03-01T15:26:08.687 に答える
3

SQL Server Management Studio(SSMS)から、Unixスタイルのファイルの場合、ROWTERMINATOR='0x0a'が機能します。ただし、ROWTERMINATOR ='\ n'は、SSMSが\ nをWindowsスタイルの行末シーケンス(\ r \ n)として解釈し、修正/中断するため、そうではありません。

興味深いことに、JavaコードからSQL ServerJDBCドライバーを介して同じROWTERMINATOR='\n'を送信すると、途中に余分な\ rがスローされないため、Unixスタイルの行末と見なされます。

したがって、2つのことを行う必要があります。

1-データファイルが実際に行末をどのように実行するかを理解していることを確認してください。

2-BULK INSERTsqlをSQLServerに配信する手段が、エスケープシーケンスをどのように解釈しているかを理解してください。私の限られた経験では、SQL Serverに16進数( '0x0a')を使用するとSQLはすべての環境で機能します。

于 2016-04-16T04:09:27.920 に答える