Как отменить транзакцию в 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
Ответы
Ответ 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 вы также можете иметь данные, которые не соответствуют стандартным размерам, перейдите в таблицу плохих данных и обработайте остальные.