Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wyjdź i cofnij wszystko w skrypcie w przypadku błędu

Gdy wystąpi błąd, transakcja zostanie automatycznie wycofana, a bieżąca partia zostanie przerwana.

Egzekucja trwa jednak do następnej partii. Więc wszystkie rzeczy w partiach po wykonaniu błędu. A potem, gdy później sprawdzisz błędy, spróbujesz wycofać już wycofaną transakcję.

Ponadto, aby zatrzymać cały skrypt, a nie tylko bieżącą partię, powinieneś użyć:

raiserror('Error description here', 20, -1) with log

Zobacz moja odpowiedź tutaj aby uzyskać szczegółowe informacje na ten temat.

Musisz więc sprawdzić @error po każdej partii myślę, że coś takiego powinno działać:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd sqlserver_ado nie jest dostępnym zapleczem bazy danych (PyISAPIe w IIS)

  2. Błędy:Instrukcja INSERT EXEC nie może być zagnieżdżona. i Nie można użyć instrukcji ROLLBACK w instrukcji INSERT-EXEC. Jak to rozwiązać?

  3. Alert programu SQL Server przy użyciu zdarzenia WMI BŁĄD

  4. Maksymalny rozmiar zmiennej SQL Server 2008 R2

  5. Wewnętrzne sprzężenie SQL na wartościach zerowych