仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 667|回复: 7
打印 上一主题 下一主题

[学习教程] SQL Server中Rowcount与@@Rowcount的用法

[复制链接]
蒙在股里 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:07:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
MySQL这个名字是怎么来的已经不清楚了。基本指南和大量的库和工具带有前缀“my”已经有10年以上,而且不管怎样,MySQLAB创始人之一的的女儿也叫My。rowcount的用法:


rowcount的感化就是用来限制前面的sql在前往指定的行数以后便中断处置,好比上面的示例,
setrowcount10
select*from表A

如许的查询只会前往表A中的前10条数据。它和"selecttop10*from表A"的感化一样。注重一点,setrowcount的设置会在全部会话中无效。好比上面的sql示例:
setrowcount10
select*from表A
go
select*from表B

表A和表B都只会前往前10条数据。
要作废setrowcount的限制,只需设置setrowcount0就能够了。

从下面的示例来看,仿佛rowcount没有多年夜的用途,限定查询了局的数据,我们利用top就能够了,并且还不必忧虑假如健忘作废rowcount的设置而对前面的sql的影响。但鄙人面的情形下,rowcount的设置就会给我们带来很年夜的便利哦。

我们都晓得selecttop前面不克不及加参数,只能利用一个详细的int范例的数字。假如我们想完成top前面跟参数的功效,就只要机关sql字符串,然后利用exec来实行了。好比:
declare@nint
declare@sqlnvarchar(1000)
set@n=10
set@sql=selecttop+cast(@nasvarchar(10))+*from表A
exec(@sql)

先不说下面语句中exec的功能,单从sql的可读性下去看就很不友爱。但假如我们利用rowcount来办理,就显的很文雅了,由于setrowcount前面是可使用参数的。示比方下:
declare@nint
set@n=10
setrowcount@n
select*from表A

注重:setrowcount的限制对修正,删除一样无效。好比上面的示例:
setrowcount10
update表asetqty=10whereid<100

如许,下面语句最多只会修正表a中id<100的前10条数据(假定id<100的数据数目年夜于10)

删除也是一样
setrowcount10
deletefrom表a

如许,下面的语句最多只会删除表a中前10条数据。

@@Rowcount的用法


@@Rowcount与Rowcount看起来很像,只相差了两个@,但它们的功效是纷歧样的,@@Rowcount次要是前往前次sql语句所影响的数据行数,好比:
selecttop2*from表A
select@@Rowcount

假如表A中的数据量年夜于或即是2,那末select@@Rowcount就会前往2,假如只要1条或0条数据,那末select@@Rowcount就会前往1大概0。

注重,不要把@@Rowcount了解为只前往查询的了局数目,删除,修正,新增等语句,也会准确的前往@@Rowcount值。好比:
update表Asetgid=awheregid=a
select@@Rowcount

假如表A中存在gid=a的数据,那末select@@Rowcount就会前往它所修正数据的行数,假如不存在gid=a的数据,那末select@@Rowcount就会前往0,删除与新增都是一样。

那末,哪些中央我们会用到@@Rowcount呢?
1、大概我们见到@@Rowcount身影最多的中央是触发器中,好的触发器,一样平常城市在最后面加上if@@rowcount=0return语句,好比:
createtriggerti_tableaontableaafterupdate
as
if@@rowcount=0return
……

如许,假如tablea被修正的数据行数为0,那末触发器ti_tablea就会间接加入,而不必实行前面的代码了。

2、第二个大概用到的中央就是我们可使用@@rowcount来作递回或轮回。好比上面示例:
declare@nint
set@n=1
select*fromclient_goodswhereid=@n

while@@rowcount>0
begin
set@n=@n+1
select*fromclient_goodswhereid=@n
end

这个示例是先查询client_goods中是不是有id=1的数据,假如有,再查询是不是有id=2的数据,一向查下往,直到id没有一连为止。固然人人在看这个示例的时分不要思索这个示例的意义,它只是申明了@@rowcount能够作为轮回前提来用。

rowcount与@@rowcount的别的用法,接待人人在批评中增补。mysqld进程在一个写入当中被杀死;计算机的意外关闭(例如,如果计算机掉电);一个硬件错误。
飘灵儿 该用户已被删除
沙发
发表于 2015-1-18 12:00:06 | 只看该作者
在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。
冷月葬花魂 该用户已被删除
板凳
发表于 2015-1-25 19:07:54 | 只看该作者
发几份SQL课件,以飨阅者
金色的骷髅 该用户已被删除
地板
发表于 2015-2-9 05:11:22 | 只看该作者
索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。
蒙在股里 该用户已被删除
5#
 楼主| 发表于 2015-2-27 01:58:42 | 只看该作者
如果处理少量数据,比如几百条记录的数据,我不知道这两种情况哪个效率更高,如果处理大量数据呢?比如有表中有20万条记录.
灵魂腐蚀 该用户已被删除
6#
发表于 2015-3-8 20:08:28 | 只看该作者
无法深入到数据库系统层面去了解和探究
兰色精灵 该用户已被删除
7#
发表于 2015-3-16 15:58:00 | 只看该作者
所以你总能得到相应的升级版本,来满足你的需求。
小女巫 该用户已被删除
8#
发表于 2015-3-22 23:57:31 | 只看该作者
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 00:51

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表