SQL脚本 - 两个删除语句

时间:2018-06-11 10:25:37

标签: sql-server tsql sql-scripts

我发现这个代码进入我们的存储库,我需要修改该语句。但是,我有点犹豫,因为我在想,为什么它有两个删除语句?我试图调试它,删除第一个删除,它没有工作。据我所知,它将每100行运行一次删除。是否有一个选项,我可以有相同的行为,但只有一个DELETE语句? TIA!

USE [DBQ] 

SET ROWCOUNT 100
DELETE FROM dbo.setting WITH(ROWLOCK) WHERE CreateDate < DATEADD(day, -90, GETDATE())

WHILE @@rowcount > 0
BEGIN
 SET ROWCOUNT 100
 DELETE FROM  dbo.setting WITH(ROWLOCK) WHERE CreateDate < DATEADD(day, -90, GETDATE())
END

3 个答案:

答案 0 :(得分:1)

您只需删除rowcount

即可
DELETE FROM dbo.setting WITH(ROWLOCK)
    WHERE CreateDate < DATEADD(day, -90, GETDATE());

请注意documentation

  

使用SET ROWCOUNT不会影响DELETE,INSERT和UPDATE   SQL Server未来版本中的语句。避免使用SET ROWCOUNT   在新的开发工作中使用DELETE,INSERT和UPDATE语句,   并计划修改当前使用它的应用程序。对于类似的   行为,使用TOP语法。有关更多信息,请参阅TOP   (处理SQL)。

以这种方式编写代码的原因是批量处理delete - 删除大量记录可能需要很长时间。

如果要维护批量删除,请执行以下操作:

declare @num_deleted int;
set @num_deleted = 999;

WHILE (@num_deleted > 0)
BEGIN 
     DELETE todelete
     FROM (SELECT TOP (100) s.*
           FROM dbo.setting s WITH(ROWLOCK)
           WHERE CreateDate < DATEADD(day, -90, GETDATE())
          ) todelete;

     set @num_deleted = @@rowcount;
END;

答案 1 :(得分:0)

你可以做一个假选择来获得@@ rowcount

select 1 
WHILE @@rowcount > 0
BEGIN
  DELETE top (100) 
  FROM  dbo.setting WITH(ROWLOCK) 
  WHERE CreateDate < DATEADD(day, -90, GETDATE())
END

答案 2 :(得分:0)

添加变量并在循环内更改其值。

declare @Start bit = 0
WHILE (@Start = 0 OR @@rowcount > 0)
BEGIN
  Set @Start = 1

  DELETE top (100) 
  FROM  dbo.setting WITH(ROWLOCK) 
  WHERE CreateDate < DATEADD(day, -90, GETDATE())
END