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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章