首页 > 解决方案 > SQL Server 逐行删除并提交多条记录

问题描述

我有一个场景,我需要从表中删除每一行,但一次提交多行。

例如:我有一个表#temp1应该删除 100 条记录。但是每删除 10 条记录后,我需要提交这 10 条删除,依此类推。因此,在我必须提交 10 次以提交所有 100 条删除但循环 100 次以删除所有 100 条记录之后。

我尝试了循环和事务。下面的示例:

BEGIN TRANSACTION 
    While (@rowsdeleted <= @rowstodelete) 
    BEGIN 
      Delete records where condition is match 
      SET @deletedrows = @@rowcount  
    END
IF (deletedrows = 10)  
    BEGIN
      COMMIT TRANSACTION 
      SET deletedrows =0 
    END 

这个逻辑每次提交只提交一行。这将删除 10 条记录,当提交条件匹配时,它只提交最后删除的记录,其他 9 条记录不提交。

有没有人有任何解决方案或逻辑来实现这个问题?

标签: sql-servertransactionssql-server-2016

解决方案


declare 
    @check_tran int, 
    @deletedrows int, 
    @total_deletedrows int, 
    @max_delete int 
begin
    set @max_delete = 100; 
    
    set @check_tran = 0
    set @total_deletedrows =0
    
    BEGIN TRANSACTION
    
    While (@total_deletedrows <= @max_delete) 
    BEGIN 
        
        Delete records where condition is match 

        SET @deletedrows = @@rowcount
        SET @check_tran = @check_tran + @deletedrows
        SET @total_deletedrows = @total_deletedrows + @deletedrows  
        print @deletedrows
    
        if (@check_tran >= 10) 
        begin 
            COMMIT TRANSACTION
            SET @check_tran = 0 
            BEGIN TRANSACTION
        end
    END

    -- when record count of table will be 105 records then 5 records are not be commited
    -- so if transaction count > 0 then commit transaction 
    if (@@TRANCOUNT>0) 
    begin
        COMMIT TRANSACTION
    end 
end

推荐阅读