結果集,結果集就是select查詢以後返回的全部行數據的集合。sql
遊標則是處理結果集的一種機制吧,它能夠定位到結果集中的某一行,多數據進行讀寫,也能夠移動遊標定位到你所須要的行中進行操做數據。數據庫
通常複雜的存儲過程,都會有遊標的出現,他的用處主要有:性能優化
根據遊標檢測結果集變化的能力和消耗資源的狀況不一樣,SQL Server支持的API服務器遊標分爲一下4種:服務器
靜態遊標在滾動時檢測不到表數據變化,但消耗的資源相對不多。動態遊標在滾動時能檢測到全部表數據變化,但消耗的資源卻較多。鍵集驅動遊標則處於他們中間,因此根據需求創建適合本身的遊標,避免資源浪費。。函數
遊標的生命週期包含有五個階段:聲明遊標、打開遊標、讀取遊標數據、關閉遊標、釋放遊標。sqlserver
1.聲明遊標,語法性能
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 ] ] ]
參數說明:fetch
2.聲明一個動態遊標優化
declare orderNum_02_cursor cursor scroll for select OrderId from bigorder where orderNum='ZEORD003402'
3.打開遊標spa
--打開遊標語法 open [ Global ] cursor_name | cursor_variable_name
cursor_name:遊標名,cursor_variable_name:遊標變量名稱,該變量引用了一個遊標。
--打開遊標 open orderNum_02_cursor
4.提取數據
--提取遊標語法 Fetch [ [Next|prior|Frist|Last|Absoute n|Relative n ] from ] [Global] cursor_name [into @variable_name[,....]]
參數說明:
例子:
--提取數據 fetch first from orderNum_02_cursor fetch relative 3 from orderNum_02_cursor fetch next from orderNum_02_cursor fetch absolute 4 from orderNum_02_cursor fetch next from orderNum_02_cursor fetch last from orderNum_02_cursor fetch prior from orderNum_02_cursor select * from bigorder where orderNum='ZEORD003402'
結果(對比一下,就明白啦):
例子:
--提取數據賦值給變量 declare @OrderId int fetch absolute 3 from orderNum_02_cursor into @OrderId select @OrderId as id select * from bigorder where orderNum='ZEORD003402'
結果:
經過檢測全局變量@@Fetch_Status的值,得到提取狀態信息,該狀態用於判斷Fetch語句返回數據的有效性。當執行一條Fetch語句以後,@@Fetch_Status可能出現3種值:0,Fetch語句成功。-1:Fetch語句失敗或行不在結果集中。-2:提取的行不存在。
這個狀態值能夠幫你判斷提取數據的成功與否。
declare @OrderId int fetch absolute 3 from orderNum_02_cursor into @OrderId while @@fetch_status=0 --提取成功,進行下一條數據的提取操做 begin select @OrderId as id fetch next from orderNum_02_cursor into @OrderId --移動遊標 end
5.利用遊標更新刪除數據
--遊標修改當前數據語法 Update 基表名 Set 列名=值[,...] Where Current of 遊標名 --遊標刪除當前數據語法 Delete 基表名 Where Current of 遊標名
---遊標更新刪除當前數據 ---1.聲明遊標 declare orderNum_03_cursor cursor scroll for select OrderId ,userId from bigorder where orderNum='ZEORD003402' --2.打開遊標 open orderNum_03_cursor --3.聲明遊標提取數據所要存放的變量 declare @OrderId int ,@userId varchar(15) --4.定位遊標到哪一行 fetch First from orderNum_03_cursor into @OrderId,@userId --into的變量數量必須與遊標查詢結果集的列數相同 while @@fetch_status=0 --提取成功,進行下一條數據的提取操做 begin if @OrderId=122182 begin Update bigorder Set UserId='123' Where Current of orderNum_03_cursor --修改當前行 end if @OrderId=154074 begin Delete bigorder Where Current of orderNum_03_cursor --刪除當前行 end fetch next from orderNum_03_cursor into @OrderId ,@userId --移動遊標 end
6.關閉遊標
遊標打開後,服務器會專門爲遊標分配必定的內存空間存放遊標操做的數據結果集,同時使用遊標也會對某些數據進行封鎖。因此遊標一旦用過,應及時關閉,避免服務器資源浪費。
--關閉遊標語法 close [ Global ] cursor_name | cursor_variable_name --關閉遊標 close orderNum_03_cursor
7.刪除遊標
刪除遊標,釋放資源
--釋放遊標語法 deallocate [ Global ] cursor_name | cursor_variable_name --釋放遊標 deallocate orderNum_03_cursor