2005中新增TRY与CATCH, 没有FINALLY
例:
BEGIN TRY
DELETE FROM tbl_Currency WHERE CurrencyCode = 'RMB'
END TRY
BEGIN CATCH
...
END CATCH
CATCH子句中的函数, 记住只能在CATCH子句中使用
ERROR_NUMBER() : 错误号
ERROR_SEVERITY() : 错误级别
ERROR_STATE() : 错误状态
ERROR_MESSAGE() : 错误信息
ERROR_LINE() : 错误行
ERROR_PROCEDURE() : 错误存储过程
XACT_STATE() : 事务状态
前四个来自RAISERROR, 我们也可以用RAISERROR重新抛出错误.
XACT_STATE()的返回值
0 没有事务; 没有但前事务. 不能回滚事务, 因为这样做会导致错误
1 已提交的事务; 进程中有一个事物. 可回滚事务到一个安全点
-1 未提交的事务; 进程中有一个事物, 但是未提交的事务.必须完全回滚该事务(即ROLLBACK TRANSACTION, 也许不会做任何可能导致写入事务日志的行动.例如回滚到一个安全点).
RAISERROR函数抛出错误, SQL Server 可以抛出错误状态为0的错误, 但RAISERROR不允许. RAISERROR只允许字符值或者变量作为输入, 所以上述的函数是不允许的, 必须先赋值给变量, 再给RAISERRROR使用.
RAISERROR ({msg_id | msg_str | @local variable}
{, severity, state}
[, argument [,...n ] ] )
[WITH option [...n]]
例:
DECLARE @msg AS NVARCHAR(MAX)
DECLARE @severity AS INT
DECLARE @state AS INT
set @msg = ERROR_MESSAGE()
set @severity = ERROR_SEVERITY()
set @state = ERROR_STATE()
RAISERROR(@msg, @severity, @state)
或者
begin try
RAISERROR ('Error raised in TRY block .', 16, 1 )
end try
begin catch
DECLARE @msg AS NVARCHAR(MAX)
DECLARE @severity AS INT
DECLARE @state AS INT
set @msg = ERROR_MESSAGE()
set @severity = ERROR_SEVERITY()
set @state = ERROR_STATE()
RAISERROR(@msg, @severity, @state)
end catch
结果:
Msg 50000, Level 16, State 1, Line 17
Error raised in TRY block .