SQLServer 的 游標 詳解

2021-09-01 13:01:33 字數 4225 閱讀 3722

結果集,結果集就是select查詢之後返回的所有行資料的集合。

游標則是處理結果集的一種機制吧,它可以定位到結果集中的某一行,多資料進行讀寫,也可以移動游標定位到你所需要的行中進行運算元據。

一般複雜的儲存過程,都會有游標的出現,他的用處主要有:

定位到結果集中的某一行。

對當前位置的資料進行讀寫。

可以對結果集中的資料單獨操作,而不是整行執行相同的操作。

是面向集合的資料庫管理系統和面向行的程式設計之間的橋梁。

根據游標檢測結果集變化的能力和消耗資源的情況不同,sql server支援的api伺服器游標分為一下4種:

靜態游標在滾動時檢測不到表資料變化,但消耗的資源相對很少。動態游標在滾動時能檢測到所有表資料變化,但消耗的資源卻較多。鍵集驅動游標則處於他們中間,所以根據需求建立適合自己的游標,避免資源浪費。。

游標的生命週期包含有五個階段:宣告游標、開啟游標、讀取游標資料、關閉游標、釋放游標。

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 ] ] ]

引數說明:

2.宣告乙個動態游標

declare ordernum_02_cursor cursor scroll

for select orderid from bigorder where ordernum='zeord003402'

3.開啟游標

--開啟游標語法

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 --修改當前行

endif @orderid=154074

begin

delete bigorder where current of ordernum_03_cursor --刪除當前行

endfetch 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

mysql游標很慢 Sqlserver 游標 慢

net專案中有個模組做統計功能,原先方法速度很慢,所以需要改進,統計結果如下圖 下圖接上圖後面 原先的處理方式是,這些資料分別涉及到四五張表,前台從資料庫中查詢出需要的資料集,然後分別遍歷這些資料集拼接html字串顯示在介面上。優化思考 net專案中有個模組做統計功能,原先方法速度很慢,所以需要改進...

Sql server的游標使用

專案需要為sql server的一張表,新增一列時間戳,為時間戳設定初始值,第一條資料取值乙個月前,往後的資料加1秒,使用游標完成。先貼 create procedure modifydefault as declare j datetime declare tmp varchar 72 decla...

SQL Server 中的游標

查詢語句可能返回多條記錄,如果資料量非常大,需要使用游標來逐條讀取查詢結果集中的記錄,應用程式可以根據需要滾動或瀏覽其中的資料。游標通常是在儲存過程中使用的,在儲存過程中使用select語句查詢資料庫時,查詢返回的資料存放在結果集中。使用者在得到結果集後,需要逐行逐列的獲取其中包含的資料,從而在應用...