转:SQL Server游标的使用
使用游標(biāo)步驟:
1、在某個(gè)查詢的基礎(chǔ)上聲明游標(biāo)
下面我們來(lái)看游標(biāo)定義的參數(shù):
LOCAL和GLOBAL二選一
LOCAL意味著游標(biāo)的生存周期只在批處理或函數(shù)或存儲(chǔ)過(guò)程中可見(jiàn),而GLOBAL意味著游標(biāo)對(duì)于特定連接作為上下文,全局內(nèi)有效。如果不指定游標(biāo)作用域,默認(rèn)作用域?yàn)镚LOBAL。例如:
FORWARD_ONLY 和 SCROLL 二選一
FORWARD_ONLY意味著游標(biāo)只能從數(shù)據(jù)集開始向數(shù)據(jù)集結(jié)束的方向讀取,FETCH NEXT是唯一的選項(xiàng),而SCROLL支持游標(biāo)在定義的數(shù)據(jù)集中向任何方向,或任何位置移動(dòng),如下圖:
STATIC KEYSET DYNAMIC和FAST_FORWARD四選一
這四個(gè)關(guān)鍵字是游標(biāo)所在數(shù)據(jù)集所反應(yīng)的表內(nèi)數(shù)據(jù)和游標(biāo)讀取出的數(shù)據(jù)的關(guān)系
STATIC意味著,當(dāng)游標(biāo)被建立時(shí),將會(huì)創(chuàng)建FOR后面的SELECT語(yǔ)句所包含數(shù)據(jù)集的副本存入tempdb數(shù)據(jù)庫(kù)中,任何對(duì)于底層表內(nèi)數(shù)據(jù)的更改不會(huì)影響到游標(biāo)的內(nèi)容.
DYNAMIC是和STATIC完全相反的選項(xiàng),當(dāng)?shù)讓訑?shù)據(jù)庫(kù)更改時(shí),游標(biāo)的內(nèi)容也隨之得到反映,在下一次fetch中,數(shù)據(jù)內(nèi)容會(huì)隨之改變
KEYSET可以理解為介于STATIC和DYNAMIC的折中方案。將游標(biāo)所在結(jié)果集的唯一能確定每一行的主鍵存入tempdb,當(dāng)結(jié)果集中任何行改變或者刪除時(shí),
@@FETCH_STATUS會(huì)為-2,KEYSET無(wú)法探測(cè)新加入的數(shù)據(jù)
FAST_FORWARD可以理解成FORWARD_ONLY的優(yōu)化版本.FORWARD_ONLY執(zhí)行的是靜態(tài)計(jì)劃,而FAST_FORWARD是根據(jù)情況進(jìn)行選擇采用動(dòng)態(tài)計(jì)劃還是靜態(tài)計(jì)劃,大多數(shù)情況下FAST_FORWARD要比FORWARD_ONLY性能略好.
READ_ONLY SCROLL_LOCKS OPTIMISTIC 三選一
READ_ONLY意味著聲明的游標(biāo)只能讀取數(shù)據(jù),游標(biāo)不能做任何更新操作
SCROLL_LOCKS是另一種極端,將讀入游標(biāo)的所有數(shù)據(jù)進(jìn)行鎖定,防止其他程序進(jìn)行更改,以確保更新的絕對(duì)成功
OPTIMISTIC是相對(duì)比較好的一個(gè)選擇,OPTIMISTIC不鎖定任何數(shù)據(jù),當(dāng)需要在游標(biāo)中更新數(shù)據(jù)時(shí),如果底層表數(shù)據(jù)更新,則游標(biāo)內(nèi)數(shù)據(jù)更新不成功,如果,底層表數(shù)據(jù)未更新,則游標(biāo)內(nèi)表數(shù)據(jù)可以更新.
2、打開游標(biāo)
open c_Customers --打開游標(biāo)注意,當(dāng)全局游標(biāo)和局部游標(biāo)變量重名時(shí),默認(rèn)會(huì)打開局部變量游標(biāo)
3、從第一個(gè)游標(biāo)記錄中把列值提取到指定的變量
游標(biāo)只有支持6種移動(dòng)選項(xiàng),分別為到第一行(FIRST),最后一行(LAST),下一行(NEXT),上一行(PRIOR),直接跳到某行(ABSOLUTE(n)),相對(duì)于目前跳幾行(RELATIVE(n))
--聲明游標(biāo) declare c_Customers cursor scroll forselect CustCode from Customers --查詢所有店鋪客戶的客戶編號(hào) go open c_Customers --打開游標(biāo) declare @custCode nvarchar(20) --取下一行 fetch next from c_Customers into @custCode print @custCode --取最后一行 fetch last from c_Customers into @custCode print @custCode --取第一行 fetch first from c_Customers into @custCode print @custCode --取上一行 fetch prior from c_Customers into @custCode print @custCode --取第三行 fetch absolute 3 from c_Customers into @custCode print @custCode --取相對(duì)目前來(lái)說(shuō)上一行 fetch relative -1 from c_Customers into @custCode print @custCode4、當(dāng)還沒(méi)有超出游標(biāo)最后一行時(shí)(@@fetch_status函數(shù)的返回值是0),循環(huán)遍歷游標(biāo)記錄;在每一次遍歷中,從當(dāng)前游標(biāo)記錄中把列值提取到指定的變量,再為當(dāng)前執(zhí)行相應(yīng)的處理
--聲明游標(biāo) declare c_Customers cursor scroll forselect CustCode from Customers --查詢所有店鋪客戶的客戶編號(hào) go open c_Customers --打開游標(biāo) declare @custCode nvarchar(20) fetch next from c_Customers into @custCode while @@fetch_status = 0 beginprint @custCodefetch next from c_Customers into @custCode --從下一個(gè)游標(biāo)記錄中把列值提取到指定的變量 end5、關(guān)閉游標(biāo)
close c_Customers --關(guān)閉游標(biāo)6、釋放游標(biāo)?
deallocate c_Customers --釋放游標(biāo)示例:
--聲明游標(biāo) declare c_Customers cursor scroll forselect CustCode from Customers --查詢所有店鋪客戶的客戶編號(hào) open c_Customers --打開游標(biāo) declare @custCode nvarchar(20) fetch next from c_Customers into @custCode while @@fetch_status = 0 beginprint @custCodefetch next from c_Customers into @custCode --從下一個(gè)游標(biāo)記錄中把列值提取到指定的變量 endclose c_Customers--關(guān)閉游標(biāo) deallocate c_Customers --釋放游標(biāo)參考自:http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html
轉(zhuǎn)載于:https://www.cnblogs.com/lusunqing/p/3344464.html
總結(jié)
以上是生活随笔為你收集整理的转:SQL Server游标的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 单元测试Struts2Spring项目的
- 下一篇: Datawhale MySQL 训练营