web-dev-qa-db-ja.com

文字列データが切り捨てられたときにSQLでトランザクションをロールバックする方法は?

現在、私はトランザクション内でラップしようとしている大きなインポートプロセスを持っているので、何かが壊れた場合はロールバックできます。私が抱えている問題は、トランス内のTSQLが爆発したときに、次のSQLエラーが発生してもロールバックされないことです。

Msg 8152, Level 16, State 14, Line 249
String or binary data would be truncated.
The statement has been terminated.

以下はこのインポートTSQLをラップします

DECLARE @error INT
SELECT @error = 0
BEGIN TRANSACTION

--** begin import TSQL

--** end import TSQL

SELECT @error = @@error 
IF @error != 0 GOTO handle_error

COMMIT

handle_error: 
IF @error != 0 
BEGIN 
ROLLBACK 
END
32
Toran Billups

SQL 2005を使用している場合、次のことを試すことができます。

BEGIN TRANSACTION
BEGIN TRY
    --Run your Statements
    COMMIT TRANSACTION
END TRY
BEGIN CATCH
        ROLLBACK TRANSACTION
        DECLARE @Msg NVARCHAR(MAX)  
        SELECT @Msg=ERROR_MESSAGE() 
        RAISERROR('Error Occured: %s', 20, 101,@msg) WITH LOG
END CATCH
80
JoshBerke

xact_abort をオンにするのはどうですか

set xact_abort on
20
Sung M. Kim

このエラーが頻繁に発生する場合は、データを入力する列のサイズを修正するか、クリーニングプロセスを調整してデータを準備してからprodテーブルに入力する必要があることも指摘しておきます。 SSISでは、標準サイズを満たさないデータを不良データテーブルに移動させ、残りを処理させることもできます。

0
HLGEM