日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

转:SQL Server游标的使用

發(fā)布時(shí)間:2023/12/18 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转:SQL Server游标的使用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

使用游標(biāo)步驟:
1、在某個(gè)查詢的基礎(chǔ)上聲明游標(biāo)

--聲明游標(biāo) declare c_Customers cursor for select CustCode from Customers where IsShop=1 --查詢所有店鋪客戶的客戶編號(hà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)記錄中把列值提取到指定的變量

declare @custCode nvarchar(20) --從第一個(gè)游標(biāo)記錄中把列值提取到指定的變量 fetch next from c_Customers into @custCode

游標(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 @custCode

4、當(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)記錄中把列值提取到指定的變量 end

5、關(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。