SQL SERVER ROWCOUNT

近期使用了一个删除脚本,由于表太大,一次删除可能需要等很久,就采用了多次分段删除

这里有使用@@ROWCOUNT 但这个值是很容易变化的 下面把我用到的一些变化记下

先列出文档中给出的

执行简单分配的语句始终将 @@ROWCOUNT 值设置为 1
SET,RETURN,READTEXT,及不带查询的SELECT语句, SELECT GETDATE()或SELECT ‘Generic Text’

数据操作语言 (DML) 语句将 @@ROWCOUNT 值设置为受查询影响的行数
DECLARE CURSOR 和 FETCH 将 @@ROWCOUNT 值设置为 1
EXECUTE 语句保留前一个 @@ROWCOUNT

USE、SET、DEALLOCATE CURSOR、CLOSE CURSOR、BEGIN TRANSACTION 或 COMMIT TRANSACTION 等语句将 ROWCOUNT 值重置为 0

依据上面的说明,如果想保留@@ROWCOUNT的值,则不能随意使用@@ROWCOUNT
下面是一个错误的例子

UPDATE TBL ……

IF @@ROWCOUNT > 0
BEGIN
SET @TmpCount = @TmpCount + @@ROWCOUNT
……
END

上面的那个赋值操作将是没有意义的

IF @@ROWCOUNT > 0 –执行后@@ROWCOUNT为0
因此下面的赋值语句中的变量的值将是不会变化的.可以再用一个变量提前把@@ROWCOUNT的值保存下来,然后再用这个保留下来的值再去做其它处理

SET @CurCode = @@ROWCOUNT –执行后@@ROWCOUNT为1

然后再用这个@CurCode去做其它判断与处理.

另外删除前面的多少行,一般先想到的就是先给一个子查询,给出TOP多少个ID值出来,然后做INNER JOIN或是IN,还有一个参数可以达到同样的效果

SET ROWCOUNT 1000

设置后,在此语句后面执行的任何操作,当影响的记录数达到1000行的时候,将停止执行,直到关闭ROWCOUNT的设置. 这样可以节省掉子查询的开销

SET ROWCOUNT 0 – 关闭ROWCOUNT设置.