數據庫:SQLServer中游標的用法筆記

一、游標的概念知識

游標可以理解為SQL Server的一種數據訪問機制,它允許用戶訪問數據的維度是數據行。用戶可以對每一行數據進行單獨處理,從而降低系統開銷和潛在的阻隔情況,

游標主要用于存儲過程,觸發器和 T_SQL復雜的腳本中,它能使查詢結果集的數據用于其它T_SQL語句。在查看或處理結果集中向前或向后瀏覽每一行數據的功能。與C語言中的指針功能有些相似,它可以指向結果集中的任意位置,如果要對結果集進行逐行單獨處理時,必須聲明一個指向該結果集中的游標變量。

SQL Server 中的數據操作結果都是面向集合的,并沒有一種描述表中單一記錄的表達形式,除非使用WHERE子句限定查詢結果,使用游標可以補充這種功能,并且游標的使用和操作過程更加靈活。

游標的生命周期:聲明游標→打開游標→讀取數據→關閉游標→釋放游標。

二、游標的語法格式

DECLARE cursor_name CURSOR [ LOCAL | GLOBAL]

[ FORWARD_ONLY | SCROLL ]

[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]

[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]

[ TYPE_WARNING ]

FOR select_statement

[ FOR UPDATE [ OF column_name [,...n] ] ]

參數說明:

cursor_name:是所定義的游標的名稱。

LOCAL:對于在其中創建批處理、存儲過程或觸發器來說,該游標的作用域是局部的。

GLOBAL:指定該游標的作用域是全局的

FORWARD_ONLY:指定游標只能從第一行滾動到最后一行。FETCH NEXT是唯一支持的數據讀取選項,如果在指定FORWARD_ONLY時不指定STATIC,KEYSET和DYNAMIC關鍵字,則游標作為DYNAMIC游標進行操作,如果FORWARD_ONLY和SCROLL均為指定,則除非指定STATIC,KEYSET和DYNAMIC關鍵字,否則默認為FORWARD_ONLY。STATIC,KEYSET和DYNAMIC游標默認為SCROLL。與ODBC和ADO這類數據庫API不同,STATIC,KEYSET和DYNAMIC T_SQL游標支持FORWARD_ONLY。

STATIC:定義一個游標,以創建將該游標使用的數據臨時復本,對游標的所有請求都從tempdb中的臨時表中不得到應答;因此,在對該游標進行提取操作時返回的數據中不反映對基表所做的修改,并且該游標不允許修改。

KEYSET:指定當游標打開時,游標重復的行的成員身份和順序已經固定。對行進行唯一標識的鍵值內置在tempdb內一個稱為keyset的表中。

DYNAMIC:定義一個游標,以反映在滾動游標時對結果集內的各行所做的所有數據更改。行的數據值、順序和成員身份在每次提取時都會更改,動態游標不支持ABSOLUTE提取選項。

FAST_FORWARD:指定啟動了性能優化的FORWARD_ONLY、READ_ONLY游標。如果指定了SCROLL或FOR_UPDATE,則不能指定FAST_FORWARD。

SCROLL_LOCKS:指定通過游標進行的定位更新或刪除一定會成功。將行讀入游標時SQL Server將鎖定這些行,以確保隨后可對它們進行修改,如果還指定了FAST_FORWARD或STATIC,則不能指定SCROLL_LOCKS。

OPTIMISTIC:指定如果行自讀入游標以來已得到更新,則通過游標進行的定位更新或定位刪除不成功。當將行讀入游標時,SQL Server不鎖定行,它改用timestamp列值比較結果來確定行讀入游標后是否發生了修改,如果表不包含timestamp列,它改用校驗和值進行確定,如果以修改該行,則嘗試進行的定位更新或刪除將失敗,如果還指定了FAST_FORWARD,則不能指定OPTIMISTIC。

TYPE_WARNING:指定游標從所請求的類型隱式轉換為另一種類型時,向客戶端發送警告消息。

select_statement:是定義游標結果集中的標準SELECT語句。

注:DECLARE <游標名>CURSOR FOR 查詢語句; -- 最簡單的游標聲明

注意:關閉游標,需要執行下面兩條命令

CLOSE 游標名稱; --關閉游標

DEALLOCATE 游標名稱;--撤銷游標(釋放資源 )

三、游標主要用途

1、定位到查詢結果集中的某一行。

2、對當前位置的數據進行讀寫。

3、可以對結果集中的數據單獨操作,而不是整行執行相同的操作。

4、游標是面向數據集合和面向數據行的程序設計之間的橋梁。

四、游標的簡單示例

DECLARE @Id NVARCHAR(MAX)
DECLARE @UserName NVARCHAR(MAX)
DECLARE @Password NVARCHAR(MAX)
DECLARE @NickName NVARCHAR(MAX)
create table #tmp (Id NVARCHAR(MAX),UserName NVARCHAR(MAX),Password NVARCHAR(MAX),NickName NVARCHAR(MAX))  --建立臨時數據表--聲明一個游標mycursor,select語句中參數的個數必須要和從游標取出的變量名相同
DECLARE mycursor CURSOR  
FOR  SELECT Id,UserName,Password,NickName FROM dbo.Users
OPEN mycursor  --打開游標
--從游標里取出數據賦值到我們剛才聲明的變量中(移動游標指向到第一條數據,提取第一條數據存放在變量中)
FETCH NEXT FROM mycursor INTO @Id, @UserName,@Password,@NickName        
--判斷游標的狀態
-- 0 fetch語句成功
---1 fetch語句失敗或此行不在結果集中
--- 2 被提取的行不存在
WHILE (@@fetch_status = 0)   --如果上一次操作成功則繼續循環BEGIN        --顯示出我們每次用游標取出的值--print (@Id+'--------'+@UserName+'--------'+@Password+'----'+@NickName)--條件判斷if (@Id>=10)beginINSERT INTO #tmp(Id,UserName,Password,NickName) VALUES(@Id,@UserName,@Password,@NickName)end--用游標去取下一條記錄(繼續取下一行數據)FETCH NEXT FROM mycursor INTO @Id,@UserName,@Password,@NickName   ENDCLOSE mycursor --關閉游標
DEALLOCATE mycursor --撤銷游標(釋放資源 )
SELECT * FROM #tmp; --查詢臨時表
DROP TABLE #tmp --刪除臨時表

五、總結

建議盡量避免使用游標,游標使用時會對數據行加鎖,可能會影響其他業務的正常操作。當數據量大時執行效率也較低。另外,系統內存也是其中一個限制。因為游標其實是相當于把磁盤數據整體放入了內存中,如果游標數據量大則會造成內存不足,內存不足帶來的影響大家都知道了。所以,在數據量小比較小的情況才去使用游標。但不建議使用游標,可以通過從編程語言等方式實現相應的業務邏輯。

IT技術分享社區

個人博客網站:https://programmerblog.xyz

文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271688.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271688.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271688.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BZOJ_1009_[HNOI2008]_GT考試_(動態規劃+kmp+矩陣乘法優化+快速冪)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id1009 字符串全部由0~9組成,給出一個串s,求一個長度為n的串,不包含s的種類有多少. 分析 第一眼以為是組合.然后更滑稽的是用錯誤的方法手算樣例居然算出來是對的...我數學是有多差... 題解也是看了好半天,有點難理解. 感覺…

智慧政務解決方案(28頁)pdf_【金眾電子】智慧政務解決方案

智慧政務解決方案立式黨建廣告機廣告機簡介&#xff1a;KC-立式政務廣告機(室內/室外可選)液晶屏幕特別賣點&#xff1a;安裝簡易、亮度調節、實時更新、傳輸安全應用場所&#xff1a;各種需要文化傳播的政務機構、政府機關、會議場所等。雙立柱政務文化欄/宣傳欄文化欄簡介&am…

笨辦法學linux dhcp,了解網關、DNS、子網掩碼、MAC地址、DHCP

原標題&#xff1a;了解網關、DNS、子網掩碼、MAC地址、DHCP什么是網關、DNS、子網掩碼&#xff0c;它有什么作用&#xff0c;確實&#xff0c;我們平時在網絡中總是在不斷的提到網關&#xff0c;卻很少真正的去了解它。一、什么是網關1、什么是網關網關是一種充當轉換重任的計…

數據庫:SQLServer Stuff 函數用法筆記

今天小編給大家分享一下自己整理一下SQLServer Stuff函數用法技巧和常用示例&#xff0c;有需要的朋友可以學習一下。一、Stuff函數的作用1.1官方解釋STUFF 函數將字符串插入到另一個字符串中。 它從第一個字符串的開始位置刪除指定長度的字符&#xff1b;然后將第二個字符串插…

自定義注解,aop實現注解鎖

多線程環境下&#xff0c;會出現線程不安全的問題&#xff0c;所以要對某些方法加鎖以保證線程安全 但是如果方法過多&#xff0c;每個方法前后都加這么一句&#xff0c;有點麻煩了&#xff0c;而且代碼可讀性也會差一些。可以使用aop切面編程&#xff0c;對某些加有特定注解&…

Android——實現歡迎界面的自動跳轉(轉)

Android實現歡迎界面的自動跳轉&#xff0c;就是打開某一個安卓手機應用&#xff0c;出現的歡迎界面停留幾秒鐘&#xff0c;自動進入應用程序的主界面。在網上看到很多種實現辦法&#xff0c;但是感覺這種方法還是比較簡單的。 在onCreate里設置個Timer&#xff0c;然后建立Int…

手機端刷recovery工具_MIUI/REDMIN手機玩機匯集

愿你刷機半生歸來仍是MIUI1解鎖篇解鎖Bootloader準備工作&#xff1a;1.手機備份數據2.手機進入開發者模式①進入“設置 -> 我的設備 -> 全部參數"中連續點擊MIUI版本&#xff0c;進入”開發者模式“②進入“設置 -> 開發者選項 -> 設備解鎖狀態”中綁定賬號和…

數據結構基礎:線性表學習筆記

1、線性表定義線性表是指n個元素的有限序列(n>0),通常用(a1,a2,a3...,an),來表示。2、線性表特點1、存在唯一的一個首元素2、存在唯一一個尾元素3、除第首元素外&#xff0c;每個元素只有一個直接前驅。4、除尾元素外&#xff0c;每個元素只有一個直接后繼。3、線性表的存儲…

c語言流水燈小程序,流水燈小程序.doc

流水燈小程序流水燈小程序#include void delay() //延時函數&#xff0c;這里延時100ms{int i,j;for(i0;i<100;i){for(j0;j<2242;j){} //j循環一次大概1ms}}void main(){ //這里看LED原理圖LPC_IOCON->JTAG_TMS_PIO1_00x01;//定義p1.0引腳為輸出LPC_IOCON->JTAG_TD…

iphone導出照片到電腦_iPhone里的照片如何快速導入電腦

前幾日我一好友發微信問我&#xff1a;“向陽&#xff0c;我手機里有一萬多張照片&#xff0c;怎么能快速的備份到電腦里&#xff1f;”我一看這問題&#xff0c;確實很多果友從用蘋果手機開始&#xff0c;機器已經更新換代了好多代了&#xff0c;照片是越來越多&#xff0c;內…

數據結構基礎:棧和隊列學習筆記

1、棧1.1 棧的定義棧是只能通過訪問它的一端來實現數據的存儲和檢索的一種特殊的線性數據結構。棧的修改要遵循先進后出的原則&#xff0c;這個是棧的核心。在棧中進行插入和刪除操作的一端稱為棧頂&#xff08;Top&#xff09;。另一端被稱為棧底&#xff08;bottom&#xff0…

Jquery高級編程

1.javascript具有等于&#xff08;&#xff09;和等同&#xff08;&#xff09;等號操作符是危險的&#xff0c;因為它在執行比較之前&#xff0c;強制執行類型轉換。 2.非侵擾式編程。 3.3.3Jquery的框架結構&#xff0c;待深入理解。 4.選擇器 a.元素選擇器&#xff08;元素屬…

C語言鏈表為什么倒著輸出,關于鏈表倒著存,正著輸出。

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓題目要求是你輸入a->b->c->d&#xff0c;然后存在內存里&#xff0c;然后改變在內存里的存儲&#xff0c;改成存d->c->b->a&#xff0c;然后輸出還是abcd&#xff0c;能不能就是用一個數組也存一份輸入的&#x…

idea @Autowired 注入爆紅(無法注入)

問題如下圖所示,idea Autowired 注入爆紅(無法注入) seettings ----> Editor Inspactions ----->spring ---->spring Core ----> Code ----> Autowring for Bean Class 去掉那個勾 效果如下

華為手機相冊怎么鏡像翻轉_怎么利用手機相冊制作電子視頻

怎么通過手機照片制作視頻&#xff1f;將照片做成視頻并不是很難&#xff0c;可以直接在手機上進行操作&#xff0c;下面來看看是怎么操作的。方法/步驟在手機上打開清爽視頻編輯器&#xff0c;有視頻編輯、美拍美攝、電子相冊、特效模板、動感視頻、創意視頻、動態字幕、視頻變…

Cluster_analysis

https://en.wikipedia.org/wiki/Cluster_analysis轉載于:https://www.cnblogs.com/WCFGROUP/p/5557907.html

數據結構基礎:樹結構的學習筆記

1、樹的定義樹是n(n>0)個節點的有限集合。當n0時稱為空樹&#xff0c;當n>0 為非空樹&#xff0c;任何非空樹中&#xff0c;有且僅有一個根節點&#xff1b;其余節點可分為m(m>0)個互不相交的有限集合T1、T2 等&#xff0c;其中每一個集合都可以稱為一棵樹&#xff0c…

android組件用法說明,Android第三方控件PhotoView使用方法詳解

Android第三方控件PhotoView使用方法詳解發布時間&#xff1a;2020-10-21 15:06:09來源&#xff1a;腳本之家閱讀&#xff1a;74作者&#xff1a;zhaihaohao1PhotoView的簡介&#xff1a;這是一個圖片查看庫&#xff0c;實現圖片瀏覽功能&#xff0c;支持pinch(捏合)手勢或者點…

idea中新建分支并且切換到新建的分支上

開發新功能,idea上新建自己的分支,要在dev分支上新建 首先,idea右下角可以看到目前在dev分支上 點擊dev,接著New Branch 輸入分支名 在Local Branches中就顯示了 然后可以看到已經切換到剛新建的分支上了 想要切換到剛新建的分支上開發時,可以點擊分支,在彈框上點擊Checkout