SQLServer 存储过程 带事务处理实例(二)

CREATE PROCEDURE [dbo].********
(
	@smallOrderNo varchar(50),
	@phoneModel varchar(50),
	@beginSn varchar(50),			
	@endSn varchar(50)
)
AS 
	SET NOCOUNT ON

	declare @error int = 0				---事务中的错误记录,定义存储过程中的变量(类似程序中的变量设定)  
	declare @errerMsg varchar(500)		---事物中的错误信息记录
	declare @earlyImportDate datetime	---查找到的最早的包装数据
	declare @fiveDaysAgo datetime		---当前系统时间的5天前时间点

	create table #macSnTemp					--创建临时表
	(
		orderNo varchar(50),
		mac varchar(50),
		sn varchar(50),
		boxNo varchar(50),
		status varchar(50),
		currentBoxNum int,
		boxNumMax int,
		smallOrderNo varchar(50),
		sortBoxNum int,
		importNum int,
		importDate datetime,
		exportDate datetime,
		phoneModel varchar(50),
		zpuz varchar(50),
		rfpi varchar(50),
		bigBatchNo varchar(50),
		smallBatchNo varchar(50)
	)

	begin								--插入临时表,用以数据操作
		insert into #macSnTemp
			select orderNo,mac,sn,boxNo,status,currentBoxNum,boxNumMax,smallOrderNo
					,sortBoxNum,importNum,importDate,exportDate,phoneModel,zpuz,
					rfpi,bigBatchNo,smallBatchNo
					from macSnInfo
			where	(smallOrderNo=@smallOrderNo or @smallOrderNo='') 
				and (phoneModel=@phoneModel or @phoneModel='')  
				and (sn>=@beginSn or  @beginSn='') 
				and (sn<=@endSn or  @endSn='')
 
	end
  
	--设置事物回滚机制,xact_abort为 on,回滚整个事务
	set xact_abort on 
	--开启事务
	begin transaction 
		if not exists(select * from #macSnTemp)
			begin
				set @errerMsg='没有查询到订单数据!'    
				rollback transaction  
				select @errerMsg AS errorMsg
				return -1 --设置操作结果错误标识   
			end

		select top 1 @earlyImportDate = importDate from  #macSnTemp			--将最早的包装时间赋值
			where boxNo is not null
			order by importDate

		select @fiveDaysAgo =DateAdd(day,-5,getdate())				--系统5天前时间
	 
		if exists(select mac from #macSnTemp where (mac ='' or mac is null))
			begin 
				set @errerMsg='该订单信息内不含mac,非正常彩盒包装数据,无法删除!'    
				rollback transaction  
				select @errerMsg AS errorMsg
				return -1 --设置操作结果错误标识  
				  
			end 
		else if(ISNULL(@earlyImportDate,'1900-01-01 00:00:00.000')<@fiveDaysAgo)
			begin 
				set @errerMsg='该订单信息最早包装时间在5天之前,不允许清空订单包装数据!'    
				rollback transaction  
				select @errerMsg AS errorMsg
				return -1 --设置操作结果错误标识   
			end
		else
			begin
				-------------进行数据备份
				insert into del_bak_macSnInfo 
					select orderNo,mac,sn,boxNo,status,currentBoxNum,boxNumMax,smallOrderNo
							,sortBoxNum,importNum,importDate,exportDate,phoneModel,zpuz,
							rfpi,bigBatchNo,smallBatchNo,getdate()  
							from #macSnTemp
					
				set @error+=@@ERROR --记录有可能产生的错误号  	

				-------------备份完清空包装数据
				update macSnInfo set sn=null,boxNo=null,status=null,currentBoxNum=null,boxNumMax=null,
						sortBoxNum=null,importNum=null,importDate=null,exportDate=null,
						zpuz=null,rfpi=null,bigBatchNo=null,smallBatchNo=null
				where	(smallOrderNo=@smallOrderNo or @smallOrderNo='') 
						and (phoneModel=@phoneModel or @phoneModel='')  
						and (sn>=@beginSn or  @beginSn='') 
						and (sn<=@endSn or  @endSn='')

				set @error+=@@ERROR --记录有可能产生的错误号  
			end


if(@error<>0 or @errerMsg<>'')  
  begin  
    rollback transaction  
	select '-1' AS errorMsg
	delete from #macSnTemp;				--删除临时表
    return -1 --设置操作结果错误标识  
	
  end  
else  
  begin  
    commit transaction   
	select '1' AS errorMsg
	delete from #macSnTemp;				--删除临时表
    return 1 --操作成功的标识  
	
  end  

存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。 由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。 1、 存储过程的优点 A、 存储过程允许标准组件式编程 存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。 B、 存储过程能够实现较快的执行速度 如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。 C、 存储过程减轻网络流量 对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载。 D、 存储过程可被作为一种安全机制来充分利用 系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值