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

来源:互联网 发布:p2p网络金融监管 编辑:程序博客网 时间:2024/05/22 07:03

SQL Server 2005里引进了try...catch结构,下面具体讲述如何使用,并介绍处理错误是用到的各种函数和变量,包括:ERROR_NUMBER(),ERROR_SAEVERITY(),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


原创粉丝点击