Khi lỗi xảy ra, giao dịch sẽ tự động được khôi phục và lô hiện tại bị hủy bỏ.
Tuy nhiên, việc thực thi tiếp tục sang đợt tiếp theo. Vì vậy, tất cả những thứ trong lô sau khi lỗi sẽ được thực thi. Và sau đó, khi bạn kiểm tra lỗi sau đó, bạn cố gắng khôi phục một giao dịch đã được khôi phục.
Ngoài ra, để dừng toàn bộ tập lệnh, không chỉ lô hiện tại, bạn nên sử dụng:
raiserror('Error description here', 20, -1) with log
Xem câu trả lời của tôi ở đây để biết chi tiết về cái đó.
Vì vậy, bạn cần kiểm tra @error
sau mỗi đợt, tôi nghĩ rằng một cái gì đó như thế này sẽ hoạt động:
BEGIN TRANSACTION
GO
ALTER Stuff
GO
if @@error != 0 raiserror('Script failed', 20, -1) with log
GO
CREATE New Stuff
GO
if @@error != 0 raiserror('Script failed', 20, -1) with log
GO
DROP Old Stuff
GO
if @@error != 0 raiserror('Script failed', 20, -1) with log
GO
PRINT 'No Errors ... Committing changes'
COMMIT TRANSACTION