Chinaunix首页 | 论坛 | 博客
  • 博客访问: 310111
  • 博文数量: 163
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: -40
  • 用 户 组: 普通用户
  • 注册时间: 2017-03-08 00:28
文章分类

全部博文(163)

文章存档

2015年(2)

2014年(35)

2013年(28)

2012年(30)

2011年(22)

2010年(14)

2009年(8)

2008年(13)

2007年(11)

分类: 数据库开发技术

2011-08-12 20:33:50

Author: Mars
MSN   :
 
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
 
 
依据上面的说明,如果想保留@@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设置.

阅读(1551) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~