sql server 2005里引进了try...catch结构,下面具体讲述如何使用,并介绍处理错误是用到的各种函数和变量,包括:ERROR_NUMBER(),ERROR_SEVERITY(),ERROR_STATE(),ERROR_PROCEDURE(),ERROR_LINE(),ERROR_MESSAGE(),@@ERROR和RAISERROR
try...catch例子如下:
BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;
SELECT @@ERROR AS ErrNum
RAISERROR (N'This is message %s %d.', -- Message text.
10, -- Severity,
1, -- State,
N'number', -- First argument.
5); -- Second argument.
END CATCH;
GO
其中catch模块里的各个错误处理方法功能如下:
ERROR_NUMBER():获取错误号。
ERROR_SEVERITY():返回错误等级(严重程度)。
ERROR_STATE():返回错误状态码。有时候在几种条件下都会发生同一种错误,比如1105号错误,每一种产生该错误的特定条件都对应一个状态码(state code),ERROR_STATE()返回的就是这个值。
ERROR_PROCEDURE():获取发生错误的sp名,如果不是sp或者trigger抛出的错误或者该方法是在catch模块外被调用,则返回null值。
ERROR_LINE():返回出错的行号。
ERROR_MESSAGE():返回错误的文本信息。
@@ERROR:错误号,和ERROR_NUMBER()不同的是,@@ERROR在每条语句执行完之后都会被重置,而ERROR_NUMBER()只在发生错误的时候才发生变化。
RAISERROR:抛出错误。具体语法如下:
RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
参数含义如下:msg_id是消息ID,保存在sys.messages中。
msg_str 是消息文本,是临时指定的文本消息。
@local_variable 是文本变量,保存消息文本。
severity:错误等级。
state:错误状态码。
argument:如果msg_str里包含参数,则在这里指定。
WITH option:用户指定选项,一共有3个选项可以指定,分别是
LOG:写错误日志。错误日志里的错误不能超过440字节;只有sysadmin或者有Alter TRACE权限的用户能指定本选项。
NOWAIT:立即发送错误信息。
SETERROR:将msg_id的值赋给@@ERROR和ERROR_NUMBER,如果没有msg_id,就赋值5000.
eg.
RAISERROR (N'This is message %s %d.', -- Message text.
10, -- Severity,
1, -- State,
N'number', -- First argument.
5); -- Second argument.
-- The message text returned is: This is message number 5.
GO
RAISERROR (N'<<%*.*s>>', -- Message text.
10, -- Severity,
1, -- State,
7, -- First argument used for width.
3, -- Second argument used for precision.
N'abcde'); -- Third argument supplies the string.
-- The message text returned is: << abc>>.
GO
DECLARE @StringVariable NVARCHAR(50);
SET @StringVariable = N'<<%7.3s>>';
RAISERROR (@StringVariable, -- Message text.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO