编程的异常处理很重要,当然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