zoukankan      html  css  js  c++  java
  • SQL Server中Rowcount与@@Rowcount

    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可以作为循环条件来用。

  • 相关阅读:
    基础总结深入:数据类型的分类和判断(数据、内存、变量) 对象 函数 回调函数 IIFE 函数中的this 分号
    BOM 定时器 通过修改元素的类来改变css JSON
    事件 事件的冒泡 事件的委派 事件的绑定 事件的传播
    DOM修改 使用DOM操作CSS
    包装类 Date Math 字符串的相关的方法 正则表达式 DOM DOM查询
    数组 call()、apply()、bind()的使用 this arguments
    autocad 二次开发 最小包围圆算法
    win10 objectarx向导在 vs2015中不起作用的解决办法
    AutoCad 二次开发 jig操作之标注跟随线移动
    AutoCad 二次开发 文字镜像
  • 原文地址:https://www.cnblogs.com/wywnet/p/4860036.html
Copyright © 2011-2022 走看看