Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Излезте и върнете всичко в скрипта при грешка

Когато възникне грешката, транзакцията се връща автоматично и текущата партида се прекъсва.

Изпълнението обаче продължава в следващата партида. Така че всички неща в партидите след грешката се изпълняват. И след това, когато проверявате за грешки по-късно, вие се опитвате да върнете вече отменена транзакция.

Освен това, за да спрете целия скрипт, а не само текущия пакет, трябва да използвате:

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

Вижте моят отговор тук за подробности относно това.

Така че трябва да проверите за @error след всяка партида мисля, че нещо подобно трябва да работи:

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. Грешка при свързване на SQL Server 2008 Няма процес в другия край на канала

  2. Какво е логически оператор в SQL Server - SQL Server / TSQL урок, част 123

  3. Стандартни низове с числов формат, поддържани от FORMAT() в SQL Server

  4. Как да добавите AM/PM към времева стойност в SQL Server (T-SQL)

  5. Използването на променливи в заявка генерира различен план на заявка