SQLServer的Top功能

所有人都知道select top 的用法,但很多人还不知道update top 和 delete top 怎么用。以往的做法是set rowcount来指定,其实SQL2005中对于Top语句的增强除了参数化之外还包括对update和delete的支持,但可惜的是还不支持自定义的order by列。如果要自定义派序列可以借助CTE.对于CTE的任何更改都会影响到原始表。

 

      我们看下面的测试代码。

 

set  nocount  on

use  tempdb
go

if (object_id ('tb' ) is  not  null )
    drop  table  tb
go
create  table  tb (id  int  identity (1 , 1 ), name  varchar (10 ), tag  int  default  0 )

insert  into  tb (name ) select  'a'
insert  into  tb (name ) select  'b'
insert  into  tb (name ) select  'c'
insert  into  tb (name ) select  'd'
insert  into  tb (name ) select  'e'


/*--更新前两行
id          name       tag
----------- ---------- -----------
1           a          1
2           b          1
3           c          0
4           d          0
5           e          0
*/
update  top (2tb  set  tag = 1
select  *  from  tb

/*--更新后两行
id          name       tag
----------- ---------- -----------
1           a          1
2           b          1
3           c          0
4           d          1
5           e          1

*/
;with  t  as
(
    select  top (2 ) *  from  tb  order  by  id  desc
)
update   t  set  tag = 1
select  *  from  tb

/*--***前两行
id          name       tag
----------- ---------- -----------
3           c          0
4           d          1
5           e          1
*/
delete  top (2 ) from  tb
select  *  from  tb

/*--***后两行
id          name       tag
----------- ---------- -----------
3           c          0
*/
;with  t  as
(
    select  top (2 ) *  from  tb  order  by  id  desc
)
delete  from   t  
select  *  from  tb

set  nocount  off

 

我会在下一篇文章中介绍一个应用,就是很多人关心的如何独占查询(就是一条数据只被一个终端select到)。

 

如果你感兴趣的话可以自己先思考一下,我给一个提示:

SQLServer2005有一个关键字Output,它可以将更改和插入的数据输出,我们配合update top就可以模拟出来一个相对高效的独占查询的事物。此功能适合用在并行的任务处理或者消费中。

 

http://blog.csdn.net/jinjazz/article/details/4520749

你可能感兴趣的:(top,delete)