【发布时间】:2016-03-07 22:32:30
【问题描述】:
我们正在尝试在WHILE 循环内运行DELETE 语句(以避免大量行的大型事务日志),如下所示:
WHILE (@@ROWCOUNT > 0)
BEGIN
DELETE TOP (250000)
FROM
MYDATABASE.MYSCHEMA.MYTABLE
WHERE
MYDATABASE.MYSCHEMA.MYTABLE.DATE_KEY = 20160301
END
当在我们的开发环境中的新 SQL Server Management Studio 连接中执行此命令时,它会删除 250K 块中的行,这是预期的行为。
当这个命令在我们的test服务器上以同样的方式执行时,我们会得到消息
Command completed successfully
即语句运行时没有进入WHILE循环。
经过一些额外的调查,我们发现行为也会因我们连接的数据库而异。因此,如果在 SQL Server Management Studio 连接到 MYDATABASE 时运行代码(在我们的 test 环境中),则 DELETE 语句不会运行。如果我们在连接到SOME_OTHER_DATABASE 时运行代码,它会运行。
我们部分怀疑@@ROWCOUNT 的值不可靠,并且可能因连接不同而不同。但是,当我们为每个数据库和服务器组合多次运行代码时,我们会看到 100% 一致的行为。所以@@ROWCOUNT 的随机初始值似乎无法解释问题。
关于这里可能发生的事情有什么建议吗?感谢您的帮助!
编辑#1
对于那些询问@@ROWCOUNT 的初始值以及它来自何处的人,我们不确定。但在某些情况下,@@ROWCOUNT 肯定会被初始化为高于零的某个值,因为代码原样在新连接上工作。
编辑#2
对于那些提议声明我们自己的变量的人,对于我们的特定应用程序,我们通过编程语言包装器执行 SQL 命令,该包装器一次只允许执行一条语句(即一个分号)。
我们之前曾尝试通过在循环前执行一条删除语句来确定@@ROWCOUNT 的值:
声明 #1:
DELETE TOP (250000)
FROM
MYDATABASE.MYSCHEMA.MYTABLE
WHERE
MYDATABASE.MYSCHEMA.MYTABLE.DATE_KEY = 20160301
声明 #2(@@ROWCOUNT 现在大概是 250,000):
WHILE (@@ROWCOUNT > 0)
BEGIN
DELETE TOP (250000)
FROM
MYDATABASE.MYSCHEMA.MYTABLE
WHERE
MYDATABASE.MYSCHEMA.MYTABLE.DATE_KEY = 20160301
END
然而,任何导致@@ROWCOUNT 在启动时呈现不同值的因素也会影响命令之间的值。所以在某些情况下,第二条语句永远不会执行。
【问题讨论】:
标签: sql sql-server rowcount