SQL中rowcount与@@rowcount
时间:2021-07-01 10:21:17
帮助过:37人阅读
rowcount的用法:
2
3 rowcount的作用就是用来限定后面的sql在返回指定的行数之后便停止处理,比如下面的示例,
4 set rowcount 10
5 select * from 表A
6
7 这样的查询只会返回表A中的前10条数据。它和 "
select top 10 * from 表A" 的作用一样。注意一点,
set rowcount 的设置会在整个会话中有效。比如下面的sql示例:
8 set rowcount 10
9 select * from 表A
10 go
11 select * from 表B
12
13 表A和表B都只会返回前10条数据。
14 要取消set rowcount的限定,只要设置
set rowcount 0 就可以了。
15
16 从上面的示例来看,好像rowcount没有多大的用处,限制查询结果的数据,我们使用top就可以了,而且还不用担心如果忘记取消rowcount的设置而对后面的sql的影响。 但在下面的情况下,rowcount的设置就会给我们带来很大的方便哦。
17
18 我们都知道select
top 后面不能加参数,只能使用一个具体的int类型的数字。如果我们想实现top后面跟参数的功能,就只有构造sql字符串,然后使用exec来执行了。比如:
19 declare @n int
20 declare @sql nvarchar(
1000)
21 set @n=10
22 set @sql=‘select top ‘+cast(
@n as varchar(
10))
+‘ * from 表A‘
23 exec(
@sql)
24
25 先不说上面语句中exec的性能,单从sql的可读性上来看就很不友好。但如果我们使用rowcount来解决,就显的很优雅了,因为set rowcount后面是可以使用参数的。示例如下:
26 declare @n int
27 set @n=10
28 set rowcount @n
29 select * from 表A
30
31 注意:
set rowcount的限定对修改,删除一样有效。比如下面的示例:
32 set rowcount 10
33 update 表a
set qty
=10 where id
<100
34
35 这样,上面语句最多只会修改表a中id
<100的前10条数据(假设id
<100的数据数量大于10)
36
37 删除也是一样
38 set rowcount 10
39 delete from 表a
40
41 这样,上面的语句最多只会删除表a中前10条数据。
42
43 @@Rowcount的用法
44
45 @@Rowcount与Rowcount看起来很像,只相差了两个@,但它们的功能是不一样的,
@@Rowcount主要是返回上次sql语句所影响的数据行数,比如:
46 select top 2 * from 表A
47 select @@Rowcount
48
49 如果表A中的数据量大于或等于2,那么select
@@Rowcount就会返回2,如果只有1条或0条数据,那么select
@@Rowcount就会返回1或者0。
50
51 注意,不要把
@@Rowcount理解为只返回查询的结果数量,删除,修改,新增等语句,也会正确的返回
@@Rowcount值。比如:
52 update 表A
set gid
=‘a‘ where gid
=‘a‘
53 select @@Rowcount
54
55 如果表A中存在gid
=‘a‘的数据,那么select
@@Rowcount就会返回它所修改数据的行数,如果不存在gid
=‘a‘的数据,那么select
@@Rowcount就会返回0,删除与新增都是同样。
56
57 那么,哪些地方我们会用到
@@Rowcount呢?
58 一、可能我们见到
@@Rowcount身影最多的地方是触发器中,好的触发器,一般都会在最前面加上if
@@rowcount=0 return语句,比如:
59 create trigger ti_tablea
on tablea after
update
60 as
61 if @@rowcount=0 return
62 ……
63
64 这样,如果tablea被修改的数据行数为0,那么触发器ti_tablea就会直接退出,而不用执行后面的代码了。
65
66 二、第二个可能用到的地方就是我们可以使用
@@rowcount来作递归或循环。比如下面示例:
67 declare @n int
68 set @n=1
69 select * from client_goods
where id
=@n
70
71 while @@rowcount>0
72 begin
73 set @n=@n+1
74 select * from client_goods
where id
=@n
75 end
76
77 这个示例是先查询client_goods中是否有id
=1的数据,如果有,再查询是否有id
=2的数据,一直查下去,直到id没有连续为止。当然大家在看这个示例的时候不要考虑这个示例的意义,它只是说明了
@@rowcount可以作为循环条件来用
SQL中rowcount与@@rowcount
标签: