sql消息队列 类似排队执行SQL存储过程

qq_36672874 2017-07-04 10:37:57
怎么写,,


还有一个问题存储过程 总感觉跑了一部分 然后后面的部分就不跑了 已经加了事务。
...全文
1151 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2017-07-05
  • 打赏
  • 举报
回复
sql消息队列,排队执行存储过程,这个最好用程序来实现。 我觉得这个消息队列,可以创建一个表,然后把要执行的存储过程名称,参数等,放到表字段里,有一个插入时候的时间,然后每次从这个表里,取出时间最早的没有执行的存储过程。 开始执行,如果报错了,那么最好要考虑把错误信息,也存储在表里,然后执行成功后,修改表中这行记录的状态为已经执行。 然后,具体取出存储过程执行的时候,可以考虑这样: begin try begin transaction exec 存储过程 end try begin catch update 表 更新状态等, 如果是捕获到异常错误,更新错误字段,记录错误信息 然后rollback end catch end catch
shoppo0505 2017-07-05
  • 打赏
  • 举报
回复
引用 6 楼 qq_36672874 的回复:
[quote=引用 4 楼 shoppo0505 的回复:] [quote=引用 2 楼 qq_36672874 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:] 1、百度Service Broker 看看是不是楼主需要的消息队列; 2、加了事务,语句要不都执行,要不都不执行,应该不存在一半执行了一半没执行的情况
哦谢谢 但是他确实发生了一半另为一半不执行的情况。。[/quote] 如果放在事务中,不应该出现这种情况。起码我没碰到过,也没听见过。 贴出大致代码来看看[/quote]代码在楼下 update KingdeeOrder 这表时候 有时候并不运行 我一开始怀疑是参数没传进来 但是并不是 参数都有值[/quote] 创建一个临时表,没做一步,将信息存进去看看。到底是为什么。 很大可能 UPDATE TBSBarcode SET State = '2' WHERE LBarcode_ID=@LBarcode_ID.....时候没有数据更新,前面的操作全回退了。
中国风 2017-07-05
  • 打赏
  • 举报
回复
按以上方法改,在事务没运行看参数条件是否满足条件,估计是回滚引起的,没有抛出错误
中国风 2017-07-05
  • 打赏
  • 举报
回复
Begin Try
Begin TransAction

  insert into TBSalesBarcode(Sales_ID,SBarcode_ID)   
				  SELECT  @Sales_ID as  Sales_ID, ID FROM TBSBarcode WHERE (LBarcode_ID = @LBarcode_ID)  
                  set @TmpROWCOUNT=@@ROWCOUNT  
  
  SELECT @SalesDetail_id=id FROM TBSalesDetail where [Sales_id]=@Sales_id and [ProductBatchNo_ID]=@ProductBatchNo_ID  
				  if isnull(@SalesDetail_id,N'')=N''  
					  BEGIN  
						   insert into TBSalesDetail(Sales_ID,ProductBatchNo_ID,Qty,Price)   
						   select @Sales_ID,@ProductBatchNo_ID, @TmpROWCOUNT,@Price  
						   set @SalesDetail_ID=@@identity  
					  END  
				  ELSE  
					  BEGIN  
						   UPDATE TBSalesDetail SET   Qty = Qty  + @TmpROWCOUNT where ID=@SalesDetail_id and [ProductBatchNo_ID]=@ProductBatchNo_ID  
					  END  
		SELECT 	@KNumber,@FitemID	 --检查参数赋值
	 update  KingdeeOrder 
	   set ActualQty=ActualQty+1
	   where KingdeeNumber=@KNumber and FitemID=@FitemID     
				   

      UPDATE TBSBarcode SET State = '2'  WHERE LBarcode_ID=@LBarcode_ID and (State = '1' ) and ( not ProductBatchNo_ID is null )  
                          set @TmpROWCOUNT2=@@ROWCOUNT  
    
           		 
	  if @TmpROWCOUNT2=0  
	   BEGIN  
		   SET @strErr='错误!!'
	       RAISERROR(16,1,'错误!!')   		    		   
	   END     

set @strErr=''
commit TransAction

End Try
Begin Catch	
		
    IF ISNULL(@strErr,'')=''
		set @strErr='网络异常' 
	RAISERROR(16,1,@strErr)
	Rollback TRANSACTION
End Catch    
二月十六 2017-07-05
  • 打赏
  • 举报
回复
引用 6 楼 qq_36672874 的回复:
[quote=引用 4 楼 shoppo0505 的回复:] [quote=引用 2 楼 qq_36672874 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:] 1、百度Service Broker 看看是不是楼主需要的消息队列; 2、加了事务,语句要不都执行,要不都不执行,应该不存在一半执行了一半没执行的情况
哦谢谢 但是他确实发生了一半另为一半不执行的情况。。[/quote] 如果放在事务中,不应该出现这种情况。起码我没碰到过,也没听见过。 贴出大致代码来看看[/quote]代码在楼下 update KingdeeOrder 这表时候 有时候并不运行 我一开始怀疑是参数没传进来 但是并不是 参数都有值[/quote] 参数都有值,那是不是加到where条件上也能搜出来数据呢?就是select * from 表 where 字段=@参数 这样可以搜索出来呢?
qq_36672874 2017-07-05
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
[quote=引用 2 楼 qq_36672874 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:] 1、百度Service Broker 看看是不是楼主需要的消息队列; 2、加了事务,语句要不都执行,要不都不执行,应该不存在一半执行了一半没执行的情况
哦谢谢 但是他确实发生了一半另为一半不执行的情况。。[/quote] 怎么判断的?要不楼主把语句贴上来看看[/quote]SQL在楼下
qq_36672874 2017-07-05
  • 打赏
  • 举报
回复
引用 4 楼 shoppo0505 的回复:
[quote=引用 2 楼 qq_36672874 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:] 1、百度Service Broker 看看是不是楼主需要的消息队列; 2、加了事务,语句要不都执行,要不都不执行,应该不存在一半执行了一半没执行的情况
哦谢谢 但是他确实发生了一半另为一半不执行的情况。。[/quote] 如果放在事务中,不应该出现这种情况。起码我没碰到过,也没听见过。 贴出大致代码来看看[/quote]代码在楼下 update KingdeeOrder 这表时候 有时候并不运行 我一开始怀疑是参数没传进来 但是并不是 参数都有值
qq_36672874 2017-07-05
  • 打赏
  • 举报
回复
Begin Try
Begin TransAction

  insert into TBSalesBarcode(Sales_ID,SBarcode_ID)   
				  SELECT  @Sales_ID as  Sales_ID, ID FROM TBSBarcode WHERE (LBarcode_ID = @LBarcode_ID)  
                  set @TmpROWCOUNT=@@ROWCOUNT  
  
  SELECT @SalesDetail_id=id FROM TBSalesDetail where [Sales_id]=@Sales_id and [ProductBatchNo_ID]=@ProductBatchNo_ID  
				  if isnull(@SalesDetail_id,N'')=N''  
					  BEGIN  
						   insert into TBSalesDetail(Sales_ID,ProductBatchNo_ID,Qty,Price)   
						   select @Sales_ID,@ProductBatchNo_ID, @TmpROWCOUNT,@Price  
						   set @SalesDetail_ID=@@identity  
					  END  
				  ELSE  
					  BEGIN  
						   UPDATE TBSalesDetail SET   Qty = Qty  + @TmpROWCOUNT where ID=@SalesDetail_id and [ProductBatchNo_ID]=@ProductBatchNo_ID  
					  END  
				 
	 update  KingdeeOrder 
	   set ActualQty=ActualQty+1
	   where KingdeeNumber=@KNumber and FitemID=@FitemID     
				   

      UPDATE TBSBarcode SET State = '2'  WHERE LBarcode_ID=@LBarcode_ID and (State = '1' ) and ( not ProductBatchNo_ID is null )  
                          set @TmpROWCOUNT2=@@ROWCOUNT  
    
           		 
	  if @TmpROWCOUNT2=0  
	   BEGIN  
	       Rollback TransAction	   
		                 set @strErr= '错误!!'   		    		   
	   END     
	   else
	   BEGIN 
		   set @strErr=''
		   commit TransAction
	   end
End Try
	Begin Catch	
		Rollback TransAction
			set @strErr='网络异常' 
	End Catch    
 if isnull(@strErr,N'')<>N''  
	BEGIN  
		return  
	END 
  END  
二月十六 2017-07-04
  • 打赏
  • 举报
回复
1、百度Service Broker 看看是不是楼主需要的消息队列; 2、加了事务,语句要不都执行,要不都不执行,应该不存在一半执行了一半没执行的情况
shoppo0505 2017-07-04
  • 打赏
  • 举报
回复
引用 2 楼 qq_36672874 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:] 1、百度Service Broker 看看是不是楼主需要的消息队列; 2、加了事务,语句要不都执行,要不都不执行,应该不存在一半执行了一半没执行的情况
哦谢谢 但是他确实发生了一半另为一半不执行的情况。。[/quote] 如果放在事务中,不应该出现这种情况。起码我没碰到过,也没听见过。 贴出大致代码来看看
二月十六 2017-07-04
  • 打赏
  • 举报
回复
引用 2 楼 qq_36672874 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:] 1、百度Service Broker 看看是不是楼主需要的消息队列; 2、加了事务,语句要不都执行,要不都不执行,应该不存在一半执行了一半没执行的情况
哦谢谢 但是他确实发生了一半另为一半不执行的情况。。[/quote] 怎么判断的?要不楼主把语句贴上来看看
qq_36672874 2017-07-04
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
1、百度Service Broker 看看是不是楼主需要的消息队列; 2、加了事务,语句要不都执行,要不都不执行,应该不存在一半执行了一半没执行的情况
哦谢谢 但是他确实发生了一半另为一半不执行的情况。。

594

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧