如何在 SQL Server 的存储过程和函数里进行错误处理

来源:互联网 发布:梦三国2脚本怎么编程 编辑:程序博客网 时间:2024/06/11 01:13

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

 

原创粉丝点击