转载——SQL Server中Rowcount与@@Rowcount的用法
转载自:http://www.lmwlove.com/ac/ID943
rowcount的用法:
rowcount的作用就是用来限定后面的sql在返回指定的行数之后便停止处理,比如下面的示例,
select * from 表A
这样的查询只会返回表A中的前10条数据。它和 "select top 10 * from 表A" 的作用一样。注意一点,set rowcount 的设置会在整个会话中有效。比如下面的sql示例:
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 @sql nvarchar(1000)
set @n=10
set @sql='select top '+cast(@n as varchar(10))+' * from 表A'
exec(@sql)
先不说上面语句中exec的性能,单从sql的可读性上来看就很不友好。但如果我们使用rowcount来解决,就显的很优雅了,因为set rowcount后面是可以使用参数的。示例如下:
set @n=10
set rowcount @n
select * from 表A
注意:set rowcount的限定对修改,删除一样有效。比如下面的示例:
update 表a set qty=10 where id<100
这样,上面语句最多只会修改表a中id<100的前10条数据(假设id<100的数据数量大于10)
删除也是一样
delete from 表a
这样,上面的语句最多只会删除表a中前10条数据。
@@Rowcount的用法
@@Rowcount与Rowcount看起来很像,只相差了两个@,但它们的功能是不一样的,@@Rowcount主要是返回上次sql语句所影响的数据行数,比如:
select @@Rowcount
如果表A中的数据量大于或等于2,那么select @@Rowcount就会返回2,如果只有1条或0条数据,那么select @@Rowcount就会返回1或者0。
注意,不要把@@Rowcount理解为只返回查询的结果数量,删除,修改,新增等语句,也会正确的返回@@Rowcount值。比如:
select @@Rowcount
如果表A中存在gid='a'的数据,那么select @@Rowcount就会返回它所修改数据的行数,如果不存在gid='a'的数据,那么select @@Rowcount就会返回0,删除与新增都是同样。
那么,哪些地方我们会用到@@Rowcount呢?
一、可能我们见到@@Rowcount身影最多的地方是触发器中,好的触发器,一般都会在最前面加上if @@rowcount=0 return语句,比如:
as
if @@rowcount=0 return
……
这样,如果tablea被修改的数据行数为0,那么触发器ti_tablea就会直接退出,而不用执行后面的代码了。
二、第二个可能用到的地方就是我们可以使用@@rowcount来作递归或循环。比如下面示例:
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可以作为循环条件来用。
rowcount与@@rowcount的其它用法,欢迎大家在评论中补充。
说明:所有来源为 .net学习网 的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
最新文章
- SqlHelper中IN集合场景下的参数处理
- Oracle GoldenGate for Big Data 12.2.0.1的新特性
- Flash插件地址
- SQL事务用法begin tran,commit tran和rollback tran的用法
- iOS 中KVC、KVO、NSNotification、delegate 总结及区别-b
- RSA算法详解及C语言实现
- jQuery 2.2 和 1.12 新版本发布
- Web服务器压力测试一例
- C++11 半同步半异步线程池的实现
- noip级别数论?
- sql父子表结构,常用脚本
- highcharts-3d.js实现饼状图
- MySQL5.7 开启SSL
- Codeforces Round #549 (Div. 1) 题解
- 9、java中static详解
- C# 之 FTPserver中文件上传与下载(一)
- SpringMvc的上传和下载
- CodeForces 288B Polo the Penguin and Houses (暴力或都快速幂)
- POJ 3660 Cow Contest(传递闭包)
- UESTC 趣味赛命题报告E
热门文章
- 在eclipse中运行wordcount,控制台打印log4j警告
- javascript 关于一周前一个月前的处理方法
- Java中解析XML的四种方法
- HTML5最佳实践
- NET调用Java之100-Continue的坑
- 使用hexo创建github博客
- Vector3.Dot 与Vector3.Cross
- [LeetCode 110] - 平衡二叉树 (Balanced Binary Tree)
- Powershell错误处理,try catch finally
- delphi7编写客户端调用java服务器端webservice示例