Вот скрипт с вычеркнутыми ненужными частями
USE databaseName
BEGIN TRY
DECLARE @count INT
DECLARE @ErrorMsg VARCHAR(MAX)
SET @count=(SELECT COUNT(*)
FROM xxxtable
WHERE xxxcolumn = 'xxx')
IF( @count = 0 ) --This means that the script has not been run yet
BEGIN
BEGIN TRANSACTION
--do work in here
COMMIT TRANSACTION
END
ELSE
BEGIN
SELECT 'This script has already been run before. Cannot run it again.'
END
END TRY
BEGIN CATCH
IF( Xact_state() <> 0 )
BEGIN
ROLLBACK TRAN
PRINT( 'ROLLED BACK TRANSACTION' )
SELECT Error_number() AS error_number,
Error_line() AS error_line,
Error_message() AS error_message
END
END CATCH
Когда скрипт завершается ошибкой, он входит в блок catch и печатает ROLLED BACK TRANSACTION, а также отображает результаты оператора select (сообщение об ошибке и т. Д.).
Но когда я проверяю базу данных, данные до момента сбоя фиксируются. Что я тут не так делаю?
Обновление: После отката данных изменяется последнее доступное значение идентификатора. (Предположим, самое высокое доступное значение - 10, если я вставляю и выполняю откат, самое высокое доступное значение - 11, а не 10 больше). Таким образом, откат не возвращает базу данных в состояние до транзакции. Это то, что вызывало проблемы.