SQL 批量更新插入,遍历

1)存储过程  传入参数 字符串,分割    获取插入临时表  临时表数据再插入表中,根据ID进行批量更新插入操作

ALTER PROCEDURE [dbo].[SP_PDA_UID_Collection]  
    (  
	  @partno NVARCHAR(max),
	  @carton Nvarchar(max),
	  @uid Nvarchar(max),
	  @operName Nvarchar(50)
    )  
AS   
    BEGIN  
   
        SET NOCOUNT ON ;  
        --创建临时表 
		CREATE TABLE #tmp_UID(
              PartNO  NVARCHAR(max),
              ContainerNO Nvarchar(max),
              [UID] Nvarchar(max),
              OperName Nvarchar(50) 
              )
        --存储扫描数据
	    INSERT INTO #tmp_UID  
       (        
              PartNO,
              ContainerNO,
              [UID],
              OperName
       )  
         SELECT                         
              t1.value,
              t2.value,
              t3.value,
              @operName 
              FROM dbo.Fn_Split(@partno,',') as t1 
			  inner join dbo.Fn_Split(@carton,',') as t2 on t1.id=t2.id
			  inner join dbo.Fn_Split(@uid,',') as t3 on t3.id=t2.id 
		--inner join dbo.Fn_Split(@operName,',') as t4 on t4.id=t3.id 
			  
	    --根据UID判断 进行更新插入操作
	    UPDATE A
             SET PartNO=B.PartNO,ContainerNO=B.ContainerNO,UpdateBy=B.OperName,UpdateDate=GETDATE() 
        FROM WMS_UID_Collection A
        INNER JOIN #tmp_UID B ON A.UID=B.UID
        
        INSERT INTO WMS_UID_Collection
             SELECT A.PartNO,A.ContainerNO,A.UID,0,A.OperName,GETDATE() as CreateDate,'' as UpdateBy,NULL as UpdateDate FROM #tmp_UID A
                    LEFT JOIN WMS_UID_Collection B ON A.UID=b.UID 
                    WHERE B.UID IS NULL
                    
        --移除临时表
		DROP TABLE 	#tmp_UID

    END                                    
             
  
  
  
  

2)创建历史表,插入数据,遍历临时表 获取行ID 进行更新操作

--更新备货详情表状态    
		CREATE TABLE #tmp_StockUpPart(
              OutboundOrderNO  NVARCHAR(100),
              PartNO NVARCHAR(100),
              InventoryID UNIQUEIDENTIFIER,
              Temp_PartID UNIQUEIDENTIFIER) 
              
		INSERT INTO #tmp_StockUpPart    --临时表存库存表关联的PartId                     
       (                     
        OutboundOrderNO,
        PartNO,
        InventoryID,    
        Temp_PartID
       )                                
        SELECT   
         p.[OutboundOrderNO],
         p.[PartNO],
         p.[InventoryID],
         p.[StockUpPartID]  FROM [P2WMS_WH71].[dbo].[WMS_Outbound_StockUpPick] as p 
         LEFT JOIN [P2WMS_WH71].[dbo].[WMS_Outbound_StockUp] as up  ON  up.StockUpOrderNo=p.OutboundOrderNo  
         WHERE  p.OutboundOrderNO=@OrderNo AND p.InventoryID=@InventoryID GROUP BY p.[OutboundOrderNO],p.[PartNO],p.[InventoryID],p.[StockUpPartID] ;
		
		DECLARE @Temp_PartID  NVARCHAR(100)
		DECLARE @temp_GIQty  int
		DECLARE @temp_PickEAQty  int
		
		WHILE EXISTS(SELECT Temp_PartID FROM #tmp_StockUpPart)  --遍历PartId
		
		   BEGIN 
                    SELECT @Temp_PartID= Temp_PartID FROM #tmp_StockUpPart;
                    
                    SELECT @temp_GIQty=SUM(GIQty) FROM [P2WMS_WH71].[dbo].[WMS_Outbound_StockUpPart] WHERE StockUpPartID=@Temp_PartID
                    SELECT @temp_PickEAQty=SUM(PickEAQty) FROM [P2WMS_WH71].[dbo].[WMS_Outbound_StockUpPick] WHERE StockUpPartID=@Temp_PartID and  MoveState =2 and OutboundOrderNO=@OrderNo
                    
                    IF(@temp_PickEAQty<@temp_GIQty)--部分移库
                    UPDATE [P2WMS_WH71].[dbo].[WMS_Outbound_StockUpPart] SET MoveState=1 WHERE StockUpPartID=@Temp_PartID 
                    ELSE                       --全部移库
                    UPDATE [P2WMS_WH71].[dbo].[WMS_Outbound_StockUpPart] SET MoveState=2 WHERE StockUpPartID=@Temp_PartID 
                    
                    
				 DELETE FROM #tmp_StockUpPart WHERE Temp_PartID=@Temp_PartID;
		   END
		DROP TABLE #tmp_StockUpPart

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值