SQL Server Rowcount 和 top 以及@@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可以作为循环条件来用。
SQL Server Rowcount 和 top 以及@@Rowcount 区别相关推荐
- SQL Server 和 Oracle 以及 MySQL 的区别
SQL Server 和 Oracle 以及 MySQL 的区别 历史说明区别 > Oracle: 中文译作甲骨文,成立于1977年,早期的理论基础,反而来自于一篇IBM的论文<A Rel ...
- SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别
SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别 原文:SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别 MSSQL为我们提供了两种动态执行SQL语 ...
- SQL Server中SCAN 和SEEK的区别
SQL Server中SCAN 和SEEK的区别 SQL SERVER使用扫描(scan)和查找(seek)这两种算法从数据表和索引中读取数据.这两种算法构成了查询的基础,几乎无处不在.Scan会扫描 ...
- sql server 登录名和用户名的区别和联系
sql server 登录名和用户名的区别和联系 总括:登录名可以理解为进入整个大楼的钥匙,用户名可以理解为一个房间的钥匙,这里所说的大楼就是sql server服务器,而房间就是这个sql se ...
- SQL SERVER 中的smalldatetime和datetime区别
SQL SERVER 中的smalldatetime和datetime区别 原文:SQL SERVER 中的smalldatetime和datetime区别 smalldatetime不能到秒. 不 ...
- SQL Server企业版/标准版/个人版的区别
SQL Server企业版/标准版/个人版的区别 http://blog.163.com/meteor_zc/blog/static/33150220200811291738603/ SQL Serv ...
- oracle和sql server取第一条记录的区别以及rownum详解
我们知道学生可能有重名的情况,那么当重名的时候假设只需要取得重名结果集中的第一条记录. sql server:select top(1) num,Name from M_Student where n ...
- 迄今微软不同时期发布的SQL Server各版本之间的大致区别,供参考查阅
通过在互联网上收集及微软官方网站等途径获取相关资料进行整理汇总出Microsoft SQL Server各个版本(SQL Server 2008 R2.SQL Server 2012.SQL Serv ...
- mssql和mysql的存储过程区别_MySQL和SQL Server存储过程写法上有什么区别?
展开全部 一.多数指令是相同的,包括创建和修正存储过32313133353236313431303231363533e59b9ee7ad9431333365646262程的指令. 二.很多细微的指令有 ...
- SQL Server企业版/标准版/个人版的区别?
SQL Server 2005 功能比较 Microsoft 已重新设计了 SQL Server 2005 产品系列,有 Express.Workgroup.Standard 和 Enterprise ...
最新文章
- linux下jboss的安装配置
- 解读生命密码的基本手段 ——DNA测序技术的前世今生
- 从比特大陆AI芯片入局智慧城市看阿里腾讯的城市“攻坚战”...
- HDU - 1757 A Simple Math Problem(矩阵快速幂,水题)
- 其实你女朋友也不是很爱你...
- 不要以为学java,.net或VB的就很牛
- 跟ASP.NET MVC一起使用jQuery
- 关于文件路径的斜杠和反斜杠问题
- mysql运用索引写出高效sql_从SQL Server到MySql(5) : 高性能的MySql 索引策略
- APK 包名修改工具
- 单维度量表验证性因子分析_(超详细)验证性因子分析步骤讲解
- Flutter 微信语音消息播放动画
- pythonpil安装教程_成功安装PIL步骤
- DirectSound学习(二)--流式缓冲区
- 我用二手书,在这里换了一大箱好书
- 4G时代 运营商的经营模式变化
- Ajax Interceptor工具分享
- 日期插件——bs_datetimepicker
- 定时器0 定时器2波特率发生器 AD转换
- 我活成了自己曾经很鄙视的样子