加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SqlServer---RowCount 和 @@RowCount的用法和区别

发布时间:2020-12-12 13:06:35 所属栏目:MsSql教程 来源:网络整理
导读:rowcount的用法: rowcount的作用就是用来限定后面的sql在返回指定的行数之后便停止处理,比如下面的示例, set?rowcount?10 select?*?from?表A 这样的查询只会返回表A中的前10条数据。它和?"select?top?10?*?from?表A"?的作用一样。注意一点,set?rowcount?的

rowcount的用法:

rowcount的作用就是用来限定后面的sql在返回指定的行数之后便停止处理,比如下面的示例,

set?rowcount?10
select?*?from?表A
这样的查询只会返回表A中的前10条数据。它和?"select?top?10?*?from?表A"?的作用一样。注意一点,set?rowcount?的设置会在整个会话中有效。比如下面的sql示例:
set?rowcount?10
select?*?from?表A
go
select?*?from?表B
表A和表B都只会返回前10条数据。
要取消set?rowcount的限定,只要设置?set?rowcount?0?就可以了。


从上面的示例来看,好像rowcount没有多大的用处,限制查询结果的数据,我们使用top就可以了,而且还不用担心如果忘记取消rowcount的设置而对后面的sql的影响。?但在下面的情况下,rowcount的设置就会给我们带来很大的方便哦。

我们都知道select?top?后面不能加参数,只能使用一个具体的int类型的数字。如果我们想实现top后面跟参数的功能,就只有构造sql字符串,然后使用exec来执行了。比如:

declare?@n?int
declare?@sql?nvarchar(1000)
set?@n=10
set?@sql='select?top?'+cast(@n?as?varchar(10))+'?*?from?表A'
exec(@sql)
先不说上面语句中exec的性能,单从sql的可读性上来看就很不友好。但如果我们使用rowcount来解决,就显的很优雅了,因为set?rowcount后面是可以使用参数的。示例如下:
declare?@n?int
set?@n=10
set?rowcount?@n
select?*?from?表A
注意: set?rowcount的限定对修改,删除一样有效。 比如下面的示例:
set?rowcount?10
update?表a?set?qty=10?where?id<100
这样,上面语句最多只会修改表a中id<100的前10条数据(假设id<100的数据数量大于10)
删除也是一样
set?rowcount?10
delete?from?表a
这样,上面的语句最多只会删除表a中前10条数据。

-----------------------------------------------------------------


@@Rowcount的用法


@@Rowcount与Rowcount看起来很像,只相差了两个@,但它们的功能是不一样的,@@Rowcount主要是返回上次sql语句所影响的数据行数,比如:
select?top?2?*?from?表A
select?@@Rowcount
如果表A中的数据量大于或等于2,那么select?@@Rowcount就会返回2,如果只有1条或0条数据,那么select?@@Rowcount就会返回1或者0。
注意,不要把@@Rowcount理解为只返回查询的结果数量,删除,修改,新增等语句,也会正确的返回@@Rowcount值。 比如:
update?表A?set?gid='a'?where?gid='a'
select?@@Rowcount
如果表A中存在gid='a'的数据,那么select?@@Rowcount就会返回它所修改数据的行数,如果不存在gid='a'的数据,那么select?@@Rowcount就会返回0,删除与新增都是同样。
那么,哪些地方我们会用到@@Rowcount呢?
一、可能我们见到@@Rowcount身影最多的地方是 触发器 中,好的触发器,一般都会在最前面加上if?@@rowcount=0?return语句,比如:
create?trigger?ti_tablea?on?tablea?after?update
as
if?@@rowcount=0?return
……
这样,如果tablea被修改的数据行数为0,那么触发器ti_tablea就会直接退出,而不用执行后面的代码了。
二、第二个可能用到的地方就是我们可以使用@@rowcount来作递归或循环。比如下面示例:
declare?@n?int
set?@n=1
select?*?from?client_goods?where?id=@n

while?@@rowcount>0
begin
set?@n=@n+1
select?*?from?client_goods?where?id=@n
end
这个示例是先查询client_goods中是否有id=1的数据,如果有,再查询是否有id=2的数据,一直查下去,直到id没有连续为止。当然大家在看这个示例的时候不要考虑这个示例的意义,它只是说明了@@rowcount可以作为循环条件来用。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读