代码改变世界

sql存储过程异常捕获并输出例子还有不输出过程里面判断异常 例子

2016-02-23 23:11  hello,逗比  阅读(887)  评论(0编辑  收藏  举报
编程的异常处理很重要,当然Sql语句中存储过程的异常处理也很重要,明确的异常提示能够快速的找到问题的根源,节省很多时间。

下面,我就以一个插入数据为例来说明Sql Server中的存储过程怎么捕获异常的 。

1、环境
数据库为Sql Server2008。
表(Course)结构为:
No char(10) primary key
Name varchar(20)
Comment varchar(50)
2、存储过程
就以插入数据为例,其他的可以照着写就行了。

编程语言都有异常的捕获与处理, 在 SqlServer2008 中也是这样子的。

对会出现异常的语句加上 begin try……end try ,然后进行异常捕捉:begin catch……end catch即可。

错误代码详解 很容易就能找到。

代码如下:

Create proc sp_Insert_Course 
    @No char(10), 
    @Name varchar(20), 
    @Comment varchar(50), 
    @rtn int output 
as 
    begin try 
        insert into Course values(@No,@Name,@Comment) 
        set @rtn=1 
    end try 
    begin catch 
        set @rtn=@@ERROR 
         
        --辅助信息 
        --select ERROR_LINE() as Line, 
        --    ERROR_MESSAGE() as message1, 
        --    ERROR_NUMBER() as number, 
        --    ERROR_PROCEDURE() as proc1, 
        --    ERROR_SEVERITY() as severity, 
        --    ERROR_STATE() as state1 
    end catch 
3、存储过程执行
相关代码如下:

declare 
    @rtn int 
exec sp_Insert_Course '114','语文','',@rtn output 
print @rtn

执行结果:

正常的情况下,返回值为1,

如果已经存在编号为“114”的数据,就会返回 ERROR_CODE:2627,

其他的异常情况会返回相应的代码

4、说明
如果程序有异常,把异常代码返回,然后再进行相关的处理即可。

SQL Server中的异常处理和别的数据库(如Oracle)的有点差异,但是基本思想差不多, 在最后捕获都可以得到异常。

希望能够对大家有所帮助。

原文链接:http://www.cnblogs.com/sshoub/archive/2011/08/12/2136267.html

另外一个例子 : 过程不输出错误。
----------------------------------------------

P_Insert_New_BookTitle_2K

----------------------------------------------

create proc P_Insert_New_BookTitle_2K
(@TitleName nvarchar(128),
 @Price money,
 @au_fname nvarchar(32),
 @au_name nvarchar(64),
 @CommissionRating int)
as

declare     @err int,
        @tablename sysname

begin transaction

insert dbo.Titles (TitleName, Price)
values (@TitleName, @Price)

select @err = @@error
if @err <> 0
begin
    select @tablename = 'titles'
    GOTO ERROR_HANDLER
end

insert dbo.Authors  (au_fname, au_lname, TitleID, CommissionRating)
values (@au_fname, @au_fname, @@IDENTITY, @CommissionRating)

if @err <> 0
begin
    select @tablename = 'authhors'
    GOTO ERROR_HANDLER
end

GOTO EXIT_Proc


ERROR_HANDLER:

ROLLBACK TRANSACTION

-- Log the error 
insert dbo.Application_Error_Log (tableName, UserName, errorNumber, errorSeverity, errorState)
values (@tableName, suser_sname(), @err, 0, 0)

EXIT_Proc:

commit tran