原創文章,轉載必需註明出處:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/introduce-for-sqlserver-s-cursor-1/ 最近一段時間做項目寫的T-Sql代碼老是用到游標(Cursor),所以就研究研究它的
原創文章,轉載必需註明出處:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/introduce-for-sqlserver-s-cursor-1/
最近一段時間做項目寫的T-Sql代碼老是用到游標(Cursor),所以就研究研究它的用法。這真是不看不知道,一看嚇一跳。閑話少說,下麵我們來說說Cursor的用法。
這是MSDN中Cursor的定義語句:
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR FOR select_statement [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ] [;] Transact-SQL Extended Syntax DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FOR select_statement [ FOR UPDATE [ OF column_name [ ,...n ] ] ] [;]
上來看見這一堆東西估計你的接著看下去的想法立刻消去一半了,下麵貼上正真的定義一個Cursor並且使用它的語句吧:
create table #table( Id int, Name nvarchar(512)) insert into #table values( 1, N'dong') insert into #table values( 2, N'liu') declare @name nvarchar(512) declare MyCursor cursor for select Name from #table --定義游標,游標數據集來源臨時表#table open MyCursor --打開游標以供下麵代碼使用 fetch next from MyCursor into @name --將游標指向的值賦值給臨時變數@name,游標指向下一條數據 while @@FETCH_STATUS=0 --判斷游標是否到最後一條記錄 begin select @name fetch next from MyCursor into @name end close MyCursor --關閉游標 deallocate MyCursor -- 釋放最後的游標引用時 drop table #table
上面是對游標使用的簡單瞭解,但是本文的真正目的不是這個。下麵要說的才是重點。通過上面的代碼可以很快的學到如何定義以及使用一個游標,另外需要註意的是使用完的游標一定要關閉(close)並且釋放(deallocate)。
SqlServer中我們對查詢等語句的定位是面向集合的,即操作某一集合內的數據。但是Cursor卻並非如此,它的操作對象是面對某一條(行)數據的。這樣就在性能上就會顯得Cursor更加的占記憶體、占代碼空間、鎖定資源…… 當然這些弊端要在Cursor操作足夠條數據多的時候才會顯現出來。
所以總體來說還是少用Cursor的好。但是當我們窮盡了while迴圈,子查詢,臨時表,表變數,自建函數或其他方式仍然無法實現某些查詢的時候,使用游標實現是必不可少的方法。