Abe*_*ler 8 sql sql-server error-handling goto
我在读有关错误在SQL Server处理这篇文章,他们建议使用SQL Server的GOTO在某些情况下回滚事务.例:
BEGIN TRAN
UPDATE Authors
SET Phone = '415 354-9866'
WHERE au_id = '724-80-9391'
SELECT @intErrorCode = @@ERROR
IF (@intErrorCode <> 0) GOTO PROBLEM
UPDATE Publishers
SET city = 'Calcutta', country = 'India'
WHERE pub_id = '9999'
SELECT @intErrorCode = @@ERROR
IF (@intErrorCode <> 0) GOTO PROBLEM
COMMIT TRAN
PROBLEM:
IF (@intErrorCode <> 0) BEGIN
PRINT 'Unexpected error occurred!'
ROLLBACK TRAN
END
Run Code Online (Sandbox Code Playgroud)
这篇文章是在大约10年前写的,我听说使用GOTO通常是个坏主意.以上是SQL Server中错误处理的正确方法吗?如果没有,有人可以提出更好的选择吗?
Sli*_*SFT 16
您应该在SQL 2005+中使用Try/Catch
BEGIN TRY
BEGIN TRAN
UPDATE Authors
SET Phone = '415 354-9866'
WHERE au_id = '724-80-9391'
UPDATE Publishers
SET city = 'Calcutta', country = 'India'
WHERE pub_id = '9999'
COMMIT TRAN
END TRY
BEGIN CATCH
PRINT 'Unexpected error occurred!'
IF XACT_STATE() <> 0
ROLLBACK TRAN
END CATCH
Run Code Online (Sandbox Code Playgroud)
您必须包含SET XACT_ABORT ON在Exception handling
Begin Try
SET XACT_ABORT ON
BEGIN TRAN
UPDATE Authors
SET Phone = '415 354-9866'
WHERE au_id = '724-80-9391'
UPDATE Publishers
SET city = 'Calcutta', country = 'India'
WHERE pub_id = '9999'
COMMIT TRAN
End Try
Begin Catch
Rollback Tran
End Catch
Run Code Online (Sandbox Code Playgroud)