简体   繁体   English

SQL 使用表类型参数批量更新

[英]SQL Update in Batches using Table Type Parameters

I am trying to update a table using table type parameter.我正在尝试使用表类型参数更新表。 Currently I am using the below query.目前我正在使用以下查询。 But I would like to perform update in batches having batch size as one of the parameters.但我想以批量大小作为参数之一批量执行更新。 Kindly help.请帮忙。

ALTER PROCEDURE UPDATEStatus        
 @Ids int , 
 @numbers TypeofNumbers readonly,
 @Status char(2),      
 @nname varchar(50),        
AS      
BEGIN      

BEGIN TRY 

 update e       
 set       
 e.status = @Status,
 e.user =@nname,      
 e.time = GETDATE()      
 from detailtable e
 join @numbers en on en.ID =e.ID   
 where e.oddIDs  =  @Ids

I tried to do in a single update but I wanted to do in sets or batches one by one.我试图在一次更新中完成,但我想一个接一个地成组或分批进行。 say 100 records first and then next 100 records until all are done先说 100 条记录,然后说下 100 条记录,直到全部完成

You can use something like this to do your update in batches:您可以使用类似这样的方法来批量更新:

CREATE OR ALTER PROCEDURE UPDATEStatus
   @Ids INT,
   @numbers TypeOfNumbers READONLY,
   @Status CHAR(2),
   @nname VARCHAR(50)
AS
BEGIN

   DECLARE @UpdatedRows INT;
   DECLARE @Skip INT = 0;
   DECLARE @BatchSize INT = 100;

   WHILE ISNULL(@UpdatedRows, 1) > 0
   BEGIN

      WITH CTE
      AS (SELECT   *
          FROM     @numbers AS n
          ORDER BY n.ID OFFSET @Skip * @BatchSize ROWS FETCH NEXT @BatchSize ROWS ONLY)
      UPDATE e
      SET
             e.[Status] = @Status,
             e.[User] = @nname,
             e.[time] = GETDATE()
      FROM   CTE AS en
             JOIN detailtable e ON en.ID = e.ID;

      SET @UpdatedRows = @@ROWCOUNT;
      SET @Skip = @Skip + 1;

   END;

END;
GO

Next time please also provide scripts for the DDL and some testdata.下次还请提供 DDL 的脚本和一些测试数据。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM