(1)
set ANSI_NULLS ON --见图1 set QUOTED_IDENTIFIER ON go ALTER proc [dbo].[procname] as begin begin transaction DECLARE @myerror INT set @myerror=0 delete from tbname SET @myerror=@myerror+@@ERROR insert into tbname2 select * from tbname where a>1 SET @myerror=@myerror+@@ERROR IF @myerror>0 begin rollback transaction end else begin commit transaction end end
图1
当ANSI_NULLS置ON,比较要用is而不是=
set XACT_ABORT ON ---如果不设置该项为ON,在sql中默认为OFF,那么只只回滚产生错误的 Transact-SQL 语句;设为ON,回滚整个事务 begin tran t1 ---启动一个事务 update [water].[dbo].[ErrorInf] set ErrorMessage='test' where ID=6 insert into [water].[dbo].[ErrorInf]([ID],ErrorMessage,[Description])Values(1,'test1','test1') commit tran t1 ---提交事务
sql2005支持try
BEGIN TRY BEGIN TRANSACTION insert into dbo.area values('1111') insert into dbo.area values('2222') select 1/0 insert into dbo.area values('333') COMMIT END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int SELECT @ErrMsg = ERROR_MESSAGE(), @ErrSeverity = ERROR_SEVERITY() RAISERROR(@ErrMsg, @ErrSeverity, 1) END CATCH
+
20160822
alter proc P002 ( @i2 varchar(20) ) as begin tran t001 begin try insert into dbo.t_test4 (i2)values(@i2) commit tran t001 end try begin catch print convert(nvarchar, ERROR_NUMBER())+ ':返回错误号' print convert(nvarchar,ERROR_MESSAGE()) +':返回错误信息' print convert(nvarchar,ERROR_LINE()) +':返回错误所在的行' print convert(nvarchar,ERROR_PROCEDURE()) +':返回出现错误的存储过程或触发器的名称。如果在存储过程或触发器中未出现错误,该函数返回 NULL' print convert(nvarchar,ERROR_STATE()) +':返回状态' print convert(nvarchar,ERROR_SEVERITY()) +':返回严重性' rollback tran t001 end catch