1. 程式人生 > >SQL Server遊標

SQL Server遊標

數據 關閉 last 所有 dbm server ima str 變量

  • SQL遊標概念

SQL的遊標是一種臨時的數據庫對象,既可以存放儲存在數據庫表中數據行的副本,也指向數據行的指針。

  • SQL遊標作用

1.遍歷數據行;

2.保存查詢結果,方便下文調用。概念中提到使用遊標會保存數據行的副本,那麽創建遊標後,下文查詢即可從副本中查詢,要比直接查數據庫快很多。

  • 創建遊標

語法:

declare cursor_name  --遊標名稱,唯一標識
[insensitive] [scroll] cursor 
for
select_statement --查詢語句
[for {read only| update [of column_name [,...n]]}]

insensitive

告訴DBMS產生查詢結果的臨時副本,而不是使用指針指向數據庫表中源數據。

指定insensitive時,對底層表任何改動都不會反映到遊標數據中。反之,對底層表的改動都會反映到遊標數據中。

insensitive遊標是只讀的,因此不能修改其內容,也不能通過它修改底層表數據。

scroll

表明所有的提取操作,即fetch選項(具體選項在下文提到),若不指定只能進行next提取。

read only

設置遊標數據只讀,指定read only後,對底層表的改動不會更新其遊標數據。

update [of column_name[,...n]]

定義在遊標中可被更改的列。如果只指定了update,表示所有列都可以更新。

  • FETCH語句檢索數據

剛才講了創建遊標的語法,結合fetch語句先寫個例子吧:

--創建遊標
declare cursor_school scroll cursor 
for
select Num,ChineseName from School order by Num

--打開遊標
open cursor_school

--定義變量
declare @num bigint, @schoolname nvarchar(50)

--提取最後一行學校信息
fetch last from cursor_school into @num, @schoolname

print
學校編號: + cast(@num as varchar) + 學校名稱: + @schoolname --關閉遊標 close cursor_school

結果集:

技術分享圖片

輸出結果:

學校編號:609781000000學校名稱:香港凱莉山學校

註意上文中order by之後的列必須在select中出現。

fetch語句中,SQL Server提供了6種定位選項:

next

返回結果集當前行的下一行,首次提取返回第一行。

frior

返回結果集的上一行,首次提取無數據返回。

first

返回結果集第一行。

last

返回結果集最後一行。

absolute

移動到結果集的第n行。如果n為正數,從結果集的第一行(包含第一行)起移到第n行;如果n為負數,則從結果集的最後一行起移到第n行。

relative

從遊標指針的當前位置移動n行。如果n為正數,則讀取遊標當前位置起向後的第n行數據;如果n為負數,則讀取遊標當前位置起向前的第n行數據。

  • 基於遊標的定位UPDATE語句和定位DELETE語句
//update
update table_name set column_name,... 
where current of cursor_name

//delete
delete from table_name
where current of cursor_name

使用update或delete語句時要先創建遊標。

  • 遊標關閉與釋放

CLOSE(關閉)遊標後不會釋放其占用的數據結構。那麽想要釋放占用的數據結構需要用DEALLOCATE語句,該語句不僅刪除遊標中的數據,還會將遊標作為對象從數據庫中刪除。

釋放遊標語句:deallocate cusor_name

SQL Server遊標