您的位置:首页 > 数据库 > 数据库管理

SQL Server中raiserror

更多 2015/3/8 来源:数据库管理学习浏览量:1745
学习标签: SQL Server
本文导读:在使用SQL Server存储过程或者触发器时,通常会使用自定义异常来处理一些特殊逻辑。例如游标的销毁,事务的回滚。在SQL Server中可以使用“raiserror”来抛出自定义异常,我们可以在存储过程中,抛出自定义异常,然后在catch块中捕获自定义异常。

一、raiserror语法

 
复制

RAISERROR ( { msg_id | msg_str | @local_variable }        
            { ,severity ,state }        
            [ ,argument [ ,...n ] ] 
          )       
   [ WITH option [ ,...n ] ]

 

参数说明

第一个参数:{ msg_id | msg_str | @local_variable }

msg_id消息代号,用户定义错误消息的错误号应当大于 50000。
msg_str:用户定义的错误消息,该错误消息最长可以有 2047 个字符;当指定 msg_str 时,RAISERROR 将引发一个错误号为 5000 的错误消息。

@local_variable:按照 msg_str 方式的格式化字符串变量。

 

第二个参数:severity

用户定义的与该消息关联的严重级别。任何用户都可以指定 0 到 18 之间的严重级别。
 

1、[0,10]的闭区间内,不会跳到catch;
2、如果是[11,19],则跳到catch;
3、如果[20,无穷),则直接终止数据库连接;

 

第三个参数:state

1、如果在多个位置引发相同的用户定义错误,则针对每个位置使用唯一的状态号有助于找到引发错误的代码段。

2、其值为 介于 1 至 127 之间的任意整数。(state 默认值为1)
 

第四个参数:argument

用于代替 msg_str 或对应于 msg_id 的消息中的定义的变量的参数。
 

第五个参数:option

错误的自定义选项,可以是下表中的任一值:

LOG :在错误日志和应用程序日志中记录错误;
NOWAIT:将消息立即发送给客户端;
SETERROR:将 @@ERROR 值和 ERROR_NUMBER 值设置为 msg_id 或 50000

 

二、SQL Server中raiserror实例

 

1、

 
SQL 代码   复制

DECLARE @raiseErrorCode nvarchar(50)
SET @raiseErrorCode = CONVERT(nvarchar(50), YOUR UNIQUEIDENTIFIER KEY)
RAISERROR('%s INVALID ID. There is no record in table',16,1, @raiseErrorCode)

 

2、

 
SQL 代码   复制

RAISERROR (
             N'This is message %s %d.', -- Message text,
             10,                        -- Severity,
             1,                         -- State,
             N'number',                 -- First argument.
                         -- Second argument.
          ); 
-- The message text returned is: This is message number 5.
GO

 

3、

 
SQL 代码   复制

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

 

4、从 CATCH 块返回错误消息

以下代码示例显示如何在 TRY 块中使用 RAISERROR 使执行跳至关联的 CATCH 块中。它还显示如何使用 RAISERROR 返回有关调用 CATCH 块的错误的信息。

 
SQL 代码   复制

BEGIN TRY
    RAISERROR ('Error raised in TRY block.', -- Message text.
                16, -- Severity.
-- State.
               );
END TRY
BEGIN CATCH
    DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

    SELECT 
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();

    RAISERROR (@ErrorMessage,  -- Message text.
               @ErrorSeverity, -- Severity.
               @ErrorState     -- State.
               );
END CATCH;

 

5、

 
SQL 代码   复制


IF EXISTS (SELECT * FROM SYSOBJECTS WHERE name='my_sp_test' AND TYPE='P') BEGIN

    DROP PROCEDURE my_sp_test;

END;

GO

create procedure my_sp_test @i int, @outstr varchar(100) out as

begin try

    declare @j int;

    if @i<10 begin

      set @outstr = 'system exception.';

      set @j = 10/0;  -- 因为被除数为0,所以这里将会抛出一个系统的异常

    end

    else begin

      set @j = @i;

      set @outstr = 'customer exception';

      -- 抛出自定义的异常,在最后的catch块中统一处理异常

      RAISERROR (66666, -- Message id.

           16, -- Severity,

           1 -- State,

           ) ;    

    end;

end try

begin catch 

    if @@ERROR=66666 begin  -- 通过@@ERROR的值来判断是否是自定义的异常

        set @outstr = @outstr  + '---------------- customer exception';

    end;

    return;

end catch;

go

执行该存储过程

 
SQL 代码   复制


DECLARE @OUTSTR11 VARCHAR(100);

exec dbo.my_sp_test 12,@OUTSTR11 out

print @OUTSTR11;

 

 

收藏
124
很赞
500