+ 1 на оба приведенных выше ответа.
Однако, если вы не хотите использовать TRY .. CATCH, попробуйте следующий код.Часть между строками -----
представляет тест, а над и под ним - tSQLt до и после вызова теста.Как вы можете видеть, транзакция, запущенная tSQLt перед вызовом теста, все еще остается в силе, поскольку она ожидает, произойдет ли ошибка.@@ TRANSCOUNT по-прежнему 1
. Вы можете закомментировать RAISERROR, чтобы попробовать его с без исключения.
SET NOCOUNT ON
BEGIN TRANSACTION -- DONE BY tSQLt
PRINT 'Inside tSQLt before calling the test: @@TRANCOUNT = ' + CONVERT (VARCHAR, @@TRANCOUNT)
---------------------------------
PRINT ' Start of test ---------------------------'
SAVE TRANSACTION Savepoint
PRINT ' Inside the test: @@TRANCOUNT = ' + CONVERT (VARCHAR, @@TRANCOUNT)
BEGIN TRANSACTION -- PART OF THE TEST
PRINT ' Transaction in the test: @@TRANCOUNT = ' + CONVERT (VARCHAR, @@TRANCOUNT)
RAISERROR ('A very nice error', 16, 0)
PRINT ' @@ERROR = ' + CONVERT(VARCHAR,@@ERROR)
-- PART OF THE TEST - CLEAN-UP
IF @@ERROR <> 0 ROLLBACK TRANSACTION Savepoint -- Not all the way, just tothe save point
ELSE COMMIT TRANSACTION
PRINT ' About to finish the test: @@TRANCOUNT = ' + CONVERT (VARCHAR, @@TRANCOUNT)
PRINT ' End of test ---------------------------'
---------------------------------
ROLLBACK TRANSACTION -- DONE BY tSQLt
PRINT 'Inside tSQLt after finishing the test: @@TRANCOUNT = ' + CONVERT (VARCHAR, @@TRANCOUNT)
С подтверждением информации и кодом на http://www.blackwasp.co.uk/SQLSavepoints.aspx