SQLServer之創建Transact-SQL游標

来源:https://www.cnblogs.com/vuenote/archive/2018/12/17/10132853.html
-Advertisement-
Play Games

什麼是游標 結果集,結果集就是select查詢之後返回的所有行數據的集合。 游標則是處理結果集的一種機制吧,它可以定位到結果集中的某一行,多數據進行讀寫,也可以移動游標定位到你所需要的行中進行操作數據。 一般複雜的存儲過程,都會有游標的出現,他的用處主要有: 定位到結果集中的某一行。 對當前位置的數 ...


什麼是游標

結果集,結果集就是select查詢之後返回的所有行數據的集合。

游標則是處理結果集的一種機制吧,它可以定位到結果集中的某一行,多數據進行讀寫,也可以移動游標定位到你所需要的行中進行操作數據。

一般複雜的存儲過程,都會有游標的出現,他的用處主要有:

  • 定位到結果集中的某一行。
  • 對當前位置的數據進行讀寫。
  • 可以對結果集中的數據單獨操作,而不是整行執行相同的操作。
  • 是面向集合的資料庫管理系統和麵向行的程式設計之間的橋梁。

游標使用三步曲:第一步創建游標,第二步打開游標,第三步使用游標。

游標的使用範圍是當前會話。

游標使用

第一步創建游標

語法

--聲明資料庫引用
use testss;
go

--第二種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 ] ] ]
[;]

語法註釋

--cursor_name
--Transact-SQL伺服器游標定義的名稱。 cursor_name必須符合有關標識符的規則。

--local
--指定該游標的範圍對在其中創建它的批處理、存儲過程或觸發器是局部的。
--該游標名稱僅在這個作用域內有效。在批處理、存儲過程、觸發器或存儲過程output參數中,該游標可由局部游標變數引用。
--output參數用於將局部游標傳遞迴調用批處理、存儲過程或觸發器,它們可在存儲過程終止後給游標變數分配參數使其引用游標。
--除非output參數將游標傳遞迴來,否則游標將在批處理、存儲過程或觸發器終止時隱式釋放。如果output參數將游標傳遞迴來,則游標在最後引用它的變數釋放或離開作用域時釋放。

--global
--指定該游標範圍對連接是全局的。在由此連接執行的任何存儲過程或批處理中,都可以引用該游標名稱。
--該游標僅在斷開連接時隱式釋放。
--備註
--如果global和local參數都未指定,則預設值由“預設為本地游標”資料庫選項的設置控制。

--forward_only
--指定游標只能從第一行滾動到最後一行。fetch next是唯一支持的提取選項。
--如果指定了forward_only而沒有指定static、keyset和dynamic關鍵字,則游標作為dynamic游標進行操作。
--如果未指定forward_only和scroll,則預設為forward_only,
--除非指定了關鍵字static、keyset或dynamic。static、keyset和dynamic游標預設為scroll。
--與odbc和ado等資料庫API不同,static、keyset和dynamic Transact-SQL游標支持forward_only。

--scroll
--指定所有的提取選項(first、last、prior、next、relative和absolute)均可用。 如果未在iso declare cursor中指定scroll,則next是唯一支持的提取選項。
--如果還指定了fast_forward,則無法指定scroll。

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

--keyset
--指定當游標打開時,游標中行的成員身份和順序已經固定。對行進行唯一標識的鍵集內置在tempdb內一個稱為keyset的表中。
--備註
--如果查詢引用了至少一個無唯一索引的表,則鍵集游標將轉換為靜態游標。
--對基表中的非鍵值所做的更改(由游標所有者更改或由其他用戶提交)可以在用戶滾動游標時看到。
--其他用戶執行的插入是不可見的(不能通過Transact-SQL伺服器游標執行插入)。如果刪除某一行,則在嘗試提取該行時返回的@@fetch_status為-2。
--從游標外部更新鍵值類似於刪除舊行後再插入新行。具有新值的行不可見,且嘗試提取具有舊值的行時返回的@@fetch_status為 -2。
--如果通過指定where current of子句來通過游標執行更新,則新值可見。

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

--fast_forward
--指定已啟用了性能優化的fast_forward和read_only游標。如果還指定了scroll或for_update,則無法指定fast_forward。
--備註
--可以在相同的declare cursor語句中使用fast_forward和forward_only。

--read_only
--禁止通過該游標進行更新。無法在update或delete語句的where current of子句中引用游標。
--該選項優先於要更新的游標的預設功能。

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

--optimistic
--指定如果行自讀入游標以來已得到更新,則通過游標進行的定位更新或定位刪除不成功。
--當將行讀入游標時,SQLServer不鎖定行。
--相反,它使用timestamp列值的比較,或者如果表沒有timestamp列則使用校驗和值,以確定將行讀入游標後是否已修改該行。
--如果已修改該行,嘗試進行的定位更新或定位刪除將失敗。如果還指定了fast_forward,則無法指定optimistic。

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

--select_statement
--定義游標結果集的標準select語句。在游標聲明的select_statement中不允許使用關鍵字compute、compute by、for browse和into。
--備註
--可以在游標聲明中使用查詢提示;但如果還使用for update of子句,請在for update of之後指定option(<query_hint>)。
--如果select_statement中的子句與所請求的游標類型的功能有衝突,則SQLServer會將游標隱式轉換為其他類型。有關詳細信息,請參閱“隱式游標轉換”。

--for update [of column_name [,...n]]
--定義游標中可更新的列。 如果提供了of <column_name> [, <... n>],則只允許修改所列出的列。 如果指定了update,但未指定列的列表,則除非指定了read_only併發選項,否則可以更新所有的列。

示例

declare firstcursor cursor
scroll
static
read_only
type_warning
for
select id,name from test1
--for update;

示例結果

第二步打開游標

語法

open { { [ global  ] cursor_name } | cursor_variable_name }

語法解析

--global
--指定cursor_name是指全局游標。
--cursor_name
--已聲明的游標的名稱。當同時存在以cursor_name作為名稱的全局游標和局部游標時,如果指定global,則cursor_name是指全局游標;否則,cursor_name是指局部游標。
--cursor_variable_name
--游標變數的名稱,該變數引用一個游標。

示例

open firstcursor;

示例結果

第三步使用游標

語法

fetch [ [ next | prior | first | last | absolute { n | @nvar } | relative { n | @nvar } ] from ] 
{ { [ global ] cursor_name } | @cursor_variable_name } 
[ into @variable_name [ ,...n ] ]

語法註釋

--next
--緊跟當前行返回結果行,並且當前行遞增為返回行。如果fetch next為對游標的第一次提取操作,則返回結果集中的第一行。next為預設的游標提取選項。

--prior
--返回緊鄰當前行前面的結果行,並且當前行遞減為返回行。如果fetch prior為對游標的第一次提取操作,則沒有行返回並且游標置於第一行之前。

--first
--返回游標中的第一行並將其作為當前行。

--last
--返回游標中的最後一行並將其作為當前行。

--absolute { n| @nvar}
--如果 n 或 @nvar 為正,則返回從游標起始處開始向後的第 n 行,並將返回行變成新的當前行。 
--如果 n 或 @nvar 為負,則返回從游標末尾處開始向前的第 n 行,並將返回行變成新的當前行。 
--如果 n 或 @nvar 為 0,則不返回行。 n 必須是整數常量,並且 @nvar 必須是 smallint、tinyint 或 int。

--relative { n| @nvar}
--如果 n 或 @nvar 為正,則返回從當前行開始向後的第 n 行,並將返回行變成新的當前行。 
--如果 n 或 @nvar 為負,則返回從當前行開始向前的第 n 行,並將返回行變成新的當前行。 
--如果 n 或 @nvar 為 0,則返回當前行。 在對游標進行第一次提取時,
--如果在將 n 或 @nvar 設置為負數或 0 的情況下指定fetch relative,則不返回行。 n 必須是整數常量,並且 @nvar 必須是 smallint、tinyint 或 int。

--global
--指定 cursor_name 是指全局游標。

--cursor_name
--要從中進行提取的開放游標的名稱。 當同時存在以 cursor_name 作為名稱的全局游標和局部游標時,
--如果指定global,則 cursor_name 指全局游標,如果未指定 global,則指局部游標。

--@cursor_variable_name
--游標變數名,引用要從中進行提取操作的打開的游標。

--into @variable_name[ ,...n]
--允許將提取操作的列數據放到局部變數中。 列表中的各個變數從左到右與游標結果集中的相應列相關聯。 
--各變數的數據類型必須與相應的結果集列的數據類型匹配,或是結果集列數據類型所支持的隱式轉換。 變數的數目必須與游標選擇列表中的列數一致。

示例

declare @id nvarchar(50),@name nvarchar(50);
fetch first from firstcursor into @id,@name;
select @id,@name;

示例結果

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [20181214]open file using O_DIRECT.txt--//因為一個測試需要,需要寫一個測試小例子,驗證使用O_DIRECT打開文件每次都是從磁碟讀取.--//沒想到浪費1個上午時間,C語言不是自己的擅長.#include <stdio.h>#include <stdlib. ...
  • 1.vim編輯器設置分為兩種設置,臨時設置和永久設置 2.臨時設置開啟和關閉高亮模式(目前高亮模式是開啟的) 在文本編輯器中命令行模式下輸入 3.永久設置開啟和關閉高亮模式,文件位置 etc/vimrc 設置高亮顯示 syntax on /sytax off ...
  • 使用過蘋果手機的用戶都知道,蘋果手機觸摸屏操作極為流暢,網頁瀏覽也非常輕鬆,各種網路上的應用可以說是非常完美。iPhone的娛樂功能相當的強大,能讓蘋果iPhone超越了其他手機很大的距離。但是手機怎麼投屏到電腦呢? 使用工具: 蘋果手機、電腦(網路線上) 蘋果投屏工具 方法/步驟: 1、屏幕鏡像是 ...
  • 項目背景:   現在是一名大三生,在早早的為實習做準備。一直嚮往著互聯網之都—杭州,實習也準備投往杭州。到了杭州肯定得租房 住,那麼許多租房的問題也接踵而至:房租貴、位置偏、房屋舊、房東一言不合就漲租等問題,且也經常聽學長抱怨:“早知道 公司附近租房這麼貴,當初談薪資的時候就報個更高的價格 ...
  • Zookeeper是一個開源的分散式的,為分散式應用提供協調服務的Apache項目。 1. Zookerper工作機制 2. Zookeeper工作特點 3. Zookeeper文件系統:znode不區分文件與文件夾 4. Zookeeper配置文件參數: tickTime =2000:通信心跳數, ...
  • 一、概述 1、什麼是資料庫 ? 答:數據的倉庫,如:在ATM的示例中我們創建了一個 db 目錄,稱其為資料庫 2、什麼是 MySQL、Oracle、SQLite、Access、MS SQL Server等 ? 答:他們均是一個軟體,都有兩個主要的功能: a. 將數據保存到文件或記憶體 b. 接收特定的 ...
  • 資料庫中有A B C三列,用SQL語句實現:當A列大於B列時選擇A列否則選擇B列,當B列大於C列時選擇B列否則選擇C列。 方法一: 方法二: ...
  • 一個叫team的表,裡面只有一個欄位name,一共有4 條紀錄,分別是a、b、c、d,對應四個球隊,現在四個球隊進行比賽,用一條SQL語句顯示所有可能的比賽組合。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...