【发布时间】: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