none
BCPでのデータ登録時にエラーが発生しても、コミットされてしまう RRS feed

  • 質問

  • SQL Server 2012 Express Editionで以下のようなBCPコマンドでデータ投入を行っていますが、

    エラーが発生しているにも関わらず、残りのデータがコミットされてしまいます。

    SQLServer2008R2 Standardでも同様でした。

    例えば100件あって、先頭2行は正常データ、次の20行はエラーデータ、残りは正常データの場合に、

    先頭の2行がコミットされてしまいます。

    ◆実行しているコマンド

    ==================================================

    C:\>bcp TEST.dbo.T_TEST in TEST.csv -f TEST.fmt -t, -T -eLog.log

    コピーを開始しています...
    SQLState = 22005, NativeError = 0
    Error = [Microsoft][SQL Native Client]キャストした文字コードが正しくありません。
    SQLState = 22005, NativeError = 0
    Error = [Microsoft][SQL Native Client]キャストした文字コードが正しくありません。
    SQLState = 22005, NativeError = 0
    Error = [Microsoft][SQL Native Client]キャストした文字コードが正しくありません。
    SQLState = 22005, NativeError = 0
    Error = [Microsoft][SQL Native Client]キャストした文字コードが正しくありません。
    SQLState = 22005, NativeError = 0
    Error = [Microsoft][SQL Native Client]キャストした文字コードが正しくありません。
    SQLState = 22005, NativeError = 0
    Error = [Microsoft][SQL Native Client]キャストした文字コードが正しくありません。
    SQLState = 22005, NativeError = 0
    Error = [Microsoft][SQL Native Client]キャストした文字コードが正しくありません。
    SQLState = 22005, NativeError = 0
    Error = [Microsoft][SQL Native Client]キャストした文字コードが正しくありません。
    SQLState = 22005, NativeError = 0
    Error = [Microsoft][SQL Native Client]キャストした文字コードが正しくありません。
    SQLState = 22005, NativeError = 0
    Error = [Microsoft][SQL Native Client]キャストした文字コードが正しくありません。

    2 行コピーされました。
    ネットワーク パケット サイズ (バイト): 4096
    クロック タイム (ミリ秒) 合計     : 47     平均 : (85.11 行/秒)

    ==================================================

    -bのバッチサイズをファイル行数よりも多い値に設定したり、-mの最大エラー数を0や1にしても同じ挙動でした。

    他に何処かに設定箇所があるのでしょうか?

    2012年7月25日 1:14

すべての返信

  • こんにちは。

    BCPユーティリティでは、意図されているようなトランザクション処理が行えません。
    BOL上の記載もややわかりにくいですが、対象の行のみロールバックされると記載されています。

    http://msdn.microsoft.com/ja-jp/library/ms162802.aspx

    トランザクション処理を行いたい場合は、
    BULK INSERTコマンドを利用いただくか、
    アプリケーションとしてSqlBulkCopy クラスを利用した実装を行う、
    という代替案があり得る対策かと思います。

    2012年9月24日 10:59