SQLSERVER 中的游標

2022-02-18 17:03:51 字數 3916 閱讀 5740

sqlserver 中的游標

在關聯式資料庫中,傳統的查詢是面向結果集的,如果你想一行一行的讀取資料並做相關的處理,那麼你就要用到游標(像for迴圈一樣,允許你一行一行的讀取資料) 能不用游標就不用游標,在效能上,游標會吃更多的記憶體,減少可用的併發,占用寬頻,鎖定資源,當然還有更多的**量……

總之:1.現存系統有一些游標,我們查詢必須通過游標來實現

2.作為乙個備用方式,當我們窮盡了while迴圈,子查詢,臨時表,表變數,自建函式或其他方式扔來無法實現某些查詢的時候,使用游標實現.游標的使用可以很簡單,也可以相對複雜,取決與對游標的引數,和你對他的了解程度

基本語法:

declare cursor_name cursor 

local|global

static|keyset|dynamic|fast_forward

read_only|scroll_locks|optimistic

type_warning

forselect * from table

for update of column_name

接下來一一的講解,每個引數具體的含義和使用方法。

local 和global

local 意思就是游標的生存週期只在批處理函式或儲存過程中可見;

gobal 意味著對於特定連線的上下文,全域性內都有效的呀;

forward_only 和 scroll

forward_only 意思就是說只能從資料集開始向結束的方向讀取,fetch next是唯一的搭檔;

scroll  任意方向 或位置

static keyset dynamic fast_forward

static 意思是說,當游標建立的時候,將會建立for後面的select語句所包含資料集的副本存入tempdb資料庫中,任何對底層資料的更改不會影響到游標的讀取。

dynamic 當底層資料更改的時候,游標的內容也隨之反映上來。

keyset  以理解為介於static和dynamic的折中方案。將游標所在結果集的唯一能確定每一行的主鍵存入tempdb,當結果集中任何行改變或者刪除時,@@fetch_status會為-2,keyset無法探測新加入的資料

fast_forward:......

read_only scroll_locks optimistic

read_only  意味著宣告的游標只能讀取資料,游標不能做任何更新操作

scroll_locks  將讀入游標的所有資料進行鎖定,防止其他程式進行更改,以確保更新的絕對成功

optimistic 不鎖定任何資料,當需要在游標中更新資料時,如果底層表資料更新,則游標內資料更新不成功,如果,底層表資料未更新,則游標內錶資料可以更新

游標的定義:

--

定義後直接賦值

declare cur cursor

forselect

*from

cityinfo

--先定義後賦值

declare

@cur

cursor

set@cur

=cursor

forselect

*from

cityinfo

游標的開啟,關閉,釋放

open cursor_name       --

開啟游標

close cursor_name --

可能會再次使用到,就暫時關閉

deallocate cursor_name --

當游標不再使用的時候

具體的例項一

--

定義後直接賦值

declare cur cursor

local

--本地

static --

靜態 forward_only --

單向 read_only --

唯讀for

select name from

cityinfo

open

cur

declare

@result

varchar(30

)

fetch

next

from cur into

@result

print

@result

while(@@fetch_status

=0) --

@@fetch_stattic 預設為-1 讀取成功一次後為 0 讀取完後 為-1

begin

--迴圈會多讀取一次 出現重複

fetch

next

from cur into

@result

print

@result

endclose

cur

deallocate cur

結果:(注意最後一條)

具體例項二

declare cur cursor

local

--本地

static --

動態 scroll --

滾動 read_only --

唯讀for

select name from

cityinfo

open

cur

declare

@result

varchar(100

)

--取出下一行

fetch

next

from cur into

@result

print

@result

--取出最後一行

fetch

next

from cur into

@result

print

@result

--取出第一行

fetch first from cur into

@result

print

@result

--取出上一行

fetch prior from cur into

@result

print

@result

--取出第三行

fetch absolute 3

from cur into

@result

print

@result

--取出相對目前來說的 上一行

fetch relative -

1from cur into

@result

print

@result

close

cur

deallocate cur

還要注意一點:訊息 16925,級別 16,狀態 1,第 20 行

提取型別 absolute 不能與動態游標一起使用。

更多的例項,還希望朋友們,自己動手測試一下。

SQL Server 中的游標

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

SQL Server中的游標

游標平時不怎麼用,以前學過印象也不深了,今天要用查查資料發現,這個跟我平時用臨時表的區別大嗎?好像不大。可能是我理解不深刻吧。1 usetest23 declare cusnum varchar 10 cusname nvarchar 100 cusfname nvarchar 100 這邊用nva...

sql server 中游標的使用

create table borrowbook 建立表學生借書 borrowbook int identity 1,1 stutid int stufeeid int borrowdate datetime,returndate datetime,fee money create table stu...