SQL Server中ROWCOUNT与@@ROWCOUNT的用法

一、rowcount的作用就是用来限定后面的sql在返回指定的行数之后便停止处理.

set rowcount 10
select * from table

查询的结果只会返回表table中的前10条数据。它和 "select top 10 * from table" 的作用一样。Notes:set rowcount 的设置会在整个会话中有效。比如下面的sql示例:
set rowcount 10
select * from table1

go
select * from table2

table1和table2都只会返回前10条数据。
要取消set rowcount的限定,只要设置 set rowcount 0 就可以了。

 ---------------重点用法:

我们都知道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

Notes: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返回受上一语句影响的行数,返回值类型为 int 整型。 如果行数大于 20 亿,则需要使用 ROWCOUNT_BIG。

@@ROWCOUNT和@@ERROR变量的值,在执行完一条语句后总是会发生变化,所以我们将他们作为判断的依据的时候应该首先保存在局部变量中。他们反映的都是紧接着的上一条语句对他们的影响!

我们通常可以通过update、insert语句并使用@@ROWCOUNT来检测是否更改了任何一些行

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呢?

1、可能我们见到@@Rowcount身影最多的地方是触发器中,好的触发器,一般都会在最前面加上if @@rowcount=0 return语句,比如:

create trigger ti_tablea on tablea after update

as

if @@rowcount=0 return ……

这样,如果tablea被修改的数据行数为0,那么触发器ti_tablea就会直接退出,而不用执行后面的代码了。

2、第二个可能用到的地方就是我们可以使用@@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可以作为循环条件来用。

 

posted @ 2020-11-05 18:08  小柒仔  阅读(657)  评论(0编辑  收藏  举报