認識靜態與動態游標

2021-08-22 08:07:46 字數 1912 閱讀 6104

背景:

靜態(static

)游標建立將由該游標使用的資料的臨時複本。對游標的所有請求都從tempdb 中的這一臨時表中得到應答;因此,在對該游標進行提取操作時返回的資料中不反映對基表所做的修改,並且該游標不允許修改

動態(dynamic

)游標會反映在滾動游標時對結果集內的各行所做的所有資料更改。行的資料值、順序和成員身份在每次提取時都會更改。動態游標不支援absolute

提取選項。

不指定static

關鍵字的時候,

預設定義的游標是動態(

dynamic)的

如果很在意游標的型別,

應該在定義游標的時候,

加上游標型別定義的關鍵字,

並加上type_warning

關鍵字,

以便在游標型別不是預期的情況下,

收到警告資訊

演示:

下面的演示針對static

和dynamic

游標,顯示兩者在游標迴圈期的差異

-- 定義演示資料 if

object_id

('tempdb..#tb')is

notnull

drop

table #tb

create

table #tb(

id int

primary

key,

col sysname

)insert

#tb(

id, col)

select

1,'aa'

union

allselect

2,'bb'

union

allselect

3,'cc'

union

allselect

4,'dd'

-- 游標測試

declare

cur_tb cursor

local

forward_only

read_only

type_warning

dynamic

--static

for

select

id, col

from

#tb

-- 游標開啟前刪除記錄

delete

top(1)

from

#tb

where

id = 4

select

'before cursor open',*

from #tb

-- 開啟游標

open

cur_tb

-- 游標開啟後刪除記錄

delete

top(1)

from

#tb

where

id = 3

select

'after cursor open',*

from #tb

fetch

cur_tb

while

@@fetch_status

= 0

begin

-- 游標迴圈中刪除記錄

delete

top(1)

from #tb

where id = 2

fetch cur_tb

endclose

cur_tb

deallocate

cur_tb

認識靜態與動態游標

背景 靜態 static 游標建立將由該游標使用的資料的臨時複本。對游標的所有請求都從 tempdb 中的這一臨時表中得到應答 因此,在對該游標進行提取操作時返回的資料中不反映對基表所做的修改,並且該游標不允許修改 動態 dynamic 游標會反映在滾動游標時對結果集內的各行所做的所有資料更改。行的...

認識靜態與動態游標

背景 靜態 static 游標建立將由該游標使用的資料的臨時複本。對游標的所有請求都從 tempdb 中的這一臨時表中得到應答 因此,在對該游標進行提取操作時返回的資料中不反映對基表所做的修改,並且該游標不允許修改 動態 dynamic 游標會反映在滾動游標時對結果集內的各行所做的所有資料更改。行的...

認識靜態與動態游標

背景 靜態 static 游標建立將由該游標使用的資料的臨時複本。對游標的所有請求都從 tempdb 中的這一臨時表中得到應答 因此,在對該游標進行提取操作時返回的資料中不反映對基表所做的修改,並且該游標不允許修改 動態 dynamic 游標會反映在滾動游標時對結果集內的各行所做的所有資料更改。行的...