背景:
靜態(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 游標會反映在滾動游標時對結果集內的各行所做的所有資料更改。行的...