这是做什么的?

Dan*_*rry 2 sql t-sql

偶尔,我需要清除数据库中的匿名用户配置文件.一位同事建议我使用这个程序,因为它可以不时地为其他程序运行一点喘息空间.

WHILE EXISTS (SELECT * FROM aspnet_users WITH (NOLOCK)  
    WHERE userID IN (SELECT UserID FROM #AspnetUsersToDelete))
BEGIN
  SET ROWCOUNT 1000
  DELETE FROM aspnet_users WHERE userID IN (SELECT UserID FROM #AspnetUsersToDelete )
  print 'aspnet_Users deleted: ' + CONVERT(varchar(255), @@ROWCOUNT) 
  SET ROWCOUNT 0
  WAITFOR DELAY '00:00:01'
END
Run Code Online (Sandbox Code Playgroud)

这是我第一次看到使用的NOLOCK关键字,而rowcount的逻辑似乎倒退了.是否有其他人使用类似的技术在长时间运行的过程中提供窗口,这是最好的做事方式吗?

Joe*_*lli 6

任何时候我预计会删除大量的行,我会做类似的事情来保持事务批量大小合理.

对于SQL Server 2005+,您可以使用DELETE TOP (1000)...而不是SET ROWCOUNT语句.我经常这样做:

SELECT NULL; /* Fudge @@ROWCOUNT value for first time in loop */

WHILE (@@ROWCOUNT <> 0) BEGIN
    DELETE TOP (1000)
    ...
END /* WHILE */
Run Code Online (Sandbox Code Playgroud)

  • +1 OP也可以循环直到`@@ ROWCOUNT = 0`而不是附加`SELECT`似乎没有人提到(或锁定升级). (2认同)