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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL Server之游标的基础知识

發布時間:2025/3/13 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL Server之游标的基础知识 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是游標: 游標是可以在結果集中上下游動的指針。

游標的作用: --允許定位到結果集中的特定行。 --從結果集的當前位置檢索一行或多行數據。 --支持對結果集中當前位置的行進行修改。 注意:游標雖然很好用,但是如果濫用游標的話,會對程序的性能造成很大影響,使用的時候一定要謹慎啊!

游標的種類: MS SQL SERVER 支持三種類型的游標:Transact_SQL 游標,API 服務器游標和客戶游標。

(1) Transact_SQL 游標 Transact_SQL 游標是由declare cursor語法定義、主要用在Transact_SQL 腳本、存儲過程和觸發器中。 Transact_SQL 游標主要用在服務器上,由從客戶端發送給服務器的Transact_SQL 語句或是批處理、存儲過程、觸發器中的Transact_SQL 進行管理。 Transact_SQL 游標不支持提取數據塊或多行數據。

(2) API 游標 API 游標支持在OLE DB, ODBC 以及DB_library 中使用游標函數,主要用在服務器上。 每一次客戶端應用程序調用API 游標函數,MS SQL SEVER 的OLE DB 提供者、ODBC驅動器或DB_library 的動態鏈接庫(DLL) 都會將這些客戶請求傳送給服務器以對API游標進行處理。

(3) 客戶游標 客戶游標主要是當在客戶機上緩存結果集時才使用。在客戶游標中,有一個缺省的結果集被用來在客戶機上緩存整個結果集。 客戶游標僅支持靜態游標而非動態游標。 由于服務器游標并不支持所有的Transact-SQL 語句或批處理,所以客戶游標常常僅被用作服務器游標的輔助。 因為在一般情況下,服務器游標能支持絕大多數的游標操作。 由于API 游標和Transact-SQL 游標使用在服務器端,所以被稱為服務器游標,也被稱為后臺游標,而客戶端游標被稱為前臺游標。

游標的使用方法: 使用游標有四種基本的步驟:聲明游標、打開游標、提取數據、關閉游標。

聲明一個游標 國際標準語句(ISO Syntax): declare cursor_name { [insensitive ]| [scroll] } cursor for sql_sentence [ for{ read only | update[ of column_name [ ,...n ] ] } ]

Transact-SQL 擴展語句(Transact-SQL Extended Syntax): 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 ] ] ]

insensitive 定義一個游標,以創建將由該游標使用的數據的臨時復本。對游標的所有請求都從 tempdb 中的這一臨時表中得到應答; 因此,在對該游標進行提取操作時返回的數據中不反映對基表所做的修改,并且該游標不允許修改。 使用國際語法時,如果省略 insensitive ,則已提交的(任何用戶)對基礎表的刪除和更新則會反映在后面的提取操作中。

scroll 指定所有的提取選項(first、last、prior、next、relative、absolute)均可用。 如果未在 ISO declare cursor 中指定 scroll,則 next 是唯一支持的提取選項。 如果也指定了 fast_forward,則不能指定 scroll。

read only 禁止通過該游標進行更新。在 update或 delete語句的 where current of 子句中不能引用該游標。 該選項優于要更新的游標的默認功能。 update[ of column_name [ ,...n ] ] 定義游標中可更新的列。如果指定了 of column_name [,...n],則只允許修改所列出的列。 如果指定了 update,但未指定列的列表,則可以更新所有列。 local 指定對于在其中創建的批處理、存儲過程或觸發器來說,該游標的作用域是局部的。 該游標名稱僅在這個作用域內有效。在批處理、存儲過程、觸發器或存儲過程 output參數中,該游標可由局部游標變量引用。 output參數用于將局部游標傳遞回調用批處理、存儲過程或觸發器,它們可在存儲過程終止后給游標變量分配參數使其引用游標。 除非 output參數將游標傳遞回來,否則游標將在批處理、存儲過程或觸發器終止時隱式釋放。 如果 output參數將游標傳遞回來,則游標在最后引用它的變量釋放或離開作用域時釋放。

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 Transact-SQL 游標支持 forward_only。

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

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

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

fast_forward 指定啟用了性能優化的 forward_only、read_only 游標。如果指定了scroll或for_update,則不能也指定fast_forward。

注意:在?SQL?Server?2000?中,FAST_FORWARD?和?FORWARD_ONLY?游標選項是互相排斥的。 如果指定了二者,則會引發錯誤。在?SQL?Server?2005?及更高版本中,這兩個關鍵字可以用在同一個?DECLARE?CURSOR?語句中。

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

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

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

打開游標: open cursor_name 由于打開游標是對數據庫進行一些SQL SELECT的操作,它將耗費一段時間,主要取決于您使用的系統性能和這條語句的復雜程度。

提取游標:

fetch ** from cursor_name into 變量

當用OPEN語句打開了游標并在數據庫中執行了查詢后,您不能立即利用在查詢結果集中的數據。

您必須用FETCH語句來取得數據。 一條FETCH語句一次可以將一條記錄放入程序員指定的變量中。 

--fetch first:提取游標的第一行。

--fetch next:提取上次提取的行的下一行。

--fetch prior:提取上次提取的行的前一行。

--fetch last:提取游標中的最后一行。

--fetch absolute n:

-- 如果n 為正整數,則提取 游標中的第n行

-- 如果n為負整數,則提取游標最后一行之前的第n行

-- 如果n 為0,則不提取任何行

--fetch relative n :

-- 如果n為正,則提取上次提取的行之后的第n行。

-- 如果n為負,則提取上提取的行之前的第n行。

-- 如果n為0,則再次提取同一行

@@fetch_status,返回針對連接當前打開的任何游標發出的上一條游標 fetch語句的狀態。 ?0? fetch語句成功 -1? fetch語句失敗或行不在結果集中 -2? 提取的行不存在

關閉游標 close cursor_name 刪除游標資源,釋放內存 deallocate? cursor_name

一個簡單的游標示例:

?

create proc pro_cursor as begin --聲明一個全局游標 declare mycursor cursor for select sid from score --打開游標 open mycursor --聲明一個變量 declare @sid int --循環移動 fetch next from mycursor into @sid while(@@fetch_status=0)beginupdate score set score=score+10 where sid=@sidfetch next from mycursor into @sidend close mycursor deallocate mycursor end

?

?

原文:http://www.cnblogs.com/jiajiayuan/archive/2011/07/14/2106341.html

?

轉載于:https://www.cnblogs.com/xcsn/p/5116755.html

總結

以上是生活随笔為你收集整理的SQL Server之游标的基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。