【问题标题】:SQL Server delete row by row and commit multiple recordSQL Server 逐行删除并提交多条记录
【发布时间】:2021-11-15 17:48:20
【问题描述】:

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

例如:我有一个表 #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 条记录不提交。

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

【问题讨论】:

  • 最好的解决方案是停止循环删除。只需删除要删除的行。为此使用循环是缓慢且毫无意义的。
  • 仔细查看您的代码是一场噩梦。您是在一个循环内的一个又一个事务中声明事务。
  • @SeanLange 我正在使用循环删除每一行,因为在我删除该行之后,我还需要使用其他逻辑,如果我不使用循环,这是不可能的。
  • @SeanLange 我只声明了一笔交易,但我可能需要检查更多的逻辑/验证。
  • 那你为什么要尝试每 10 行逻辑执行一次这个奇怪的提交?不,您的代码在循环中有“BEGIN TRANSACTION”。你在这里给自己制造了一场噩梦。如果您有删除单行的复杂逻辑,那么您可能应该创建一个存储过程来处理所有这些逻辑。然后循环调用你的过程。或者更好的是,重新审视所有这些逻辑并使其实现,这样您就不必跳过箍来删除行。甚至级联删除也会更好。

标签: sql-server transactions sql-server-2016


【解决方案1】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多