Подтвердить что ты не робот

Как отменить транзакцию в TSQL, когда строковые данные усечены?

В настоящее время у меня есть большой процесс импорта, который я пытаюсь обернуть внутри транзакции, поэтому, если что-то сломается - я могу откат. Проблема заключается в том, что когда 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
4b9b3361

Ответ 1

Если на 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

Ответ 2

Как насчет включения xact_abort

set xact_abort on

Ответ 3

Я также хотел бы указать, что если вы часто принимаете эту ошибку, вам нужно пересмотреть размер столбца, в который вы вводите данные, или настроить процесс очистки для подготовки данных до помещения его в таблицу prod. В SSIS вы также можете иметь данные, которые не соответствуют стандартным размерам, перейдите в таблицу плохих данных и обработайте остальные.