我发现这个代码进入我们的存储库,我需要修改该语句。但是,我有点犹豫,因为我在想,为什么它有两个删除语句?我试图调试它,删除第一个删除,它没有工作。据我所知,它将每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
答案 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