两年没怎么用Sql Server了,出去面试的时候连存储过程都写不顺畅了,太丢人了。
这里对Sql Server 2005及以上的版本在存储过程事务及异常处理方面做个记录,
if (object_id('proc_demo', 'p') is not null)
drop proc proc_demo
go
create proc proc_demo
(
@id int
)
as
begin
set nocount on;
begin try
BEGIN tran @tran
delete dt_article where id=@id
delete dt_article_albums where article_id=@id
commit tran @tran
end try
begin catch
if @@TRANCOUNT > 0
rollback tran @tran
declare @ErrMsg nvarchar(4000), @ErrSeverity int
select @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY()
raiserror (@ErrMsg, @ErrSeverity, 1) --拋出异常
end catch
end
go
Sql server 2005提供了一些系统函数返回错误信息
ERROR_NUMBER()----返回错误的数量
ERROR_SEVERITY() ----返回错误的严重级别
ERROR_STATE() ----返回错误的状态码
ERROR_PROCEDURE() ----返回发生错误的存储过程或者触发器的名称
ERROR_LINE() ----返回错误发生的行数
ERROR_MESSAGE() ----返回错误的详细信息