man*_*u08 4 sql exception-handling sql-server-2008
我想编写一个执行多个单独SQL语句的SQL脚本; 如果这些陈述中的任何一个失败,我想回滚整个交易.所以,像:
BEGIN TRANSACTION
insert into TestTable values (1)
insert into TestTable values (2)
insert into TestTabe values (3)
--if any of the statements fail
ROLLBACK
--else
COMMIT
Run Code Online (Sandbox Code Playgroud)
这适用于MS SQL 2008.有什么我可以做到的吗?也许某种异常处理?
我在实例中意识到我可以检查TestTable中的这些值并确定语句是否以这种方式失败.但实际上我的SQL会复杂得多,而且我宁愿抽象自己知道SQL在做什么.
SQL Server自2005年以来一直有异常支持:
BEGIN TRY
BEGIN TRAN
INSERT INTO ...
COMMIT TRAN
END TRY
BEGIN CATCH
EXECUTE usp_LogAndRethrowError
END CATCH
Run Code Online (Sandbox Code Playgroud)
然后,您的LogAndRethrowError可以回滚任何注定的事务,la:
-- Make sure we are not in a live or 'doomed' transaction
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION
Run Code Online (Sandbox Code Playgroud)
这是我过去做过的一种方式:
Declare @HasError int;
set @HasError = 0;
BEGIN TRANSACTION
insert into TestTable values (1)
if (@@ERROR != 0)
set @HasError = 1
insert into TestTable values (2)
if (@@ERROR != 0)
set @HasError = 1
insert into TestTabe values (3)
if (@@ERROR != 0)
set @HasError = 1
if @HasError > 0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11259 次 |
| 最近记录: |