加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 13:47:47 所属栏目:MsSql教程 来源:网络整理
导读:CREATE PROCEDURE [dbo].********(@smallOrderNo varchar(50),@phoneModel varchar(50),@beginSn varchar(50),@endSn varchar(50))AS SET NOCOUNT ONdeclare @error int = 0---事务中的错误记录,定义存储过程中的变量(类似程序中的变量设定) declare @errerM
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,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  

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读