SQLServer之ISO游標使用

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

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


什麼是游標

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

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

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

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

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

游標使用

第一步創建游標

語法

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

--創建游標
declare cursor_name [insensitive] [scroll] cursor
for select_statement
[for { read only | update [of column_name [,......n] ] } ];

語法註釋

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

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

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

--select_statement
--是定義游標結果集的標準select語句。在游標聲明的select_statement中不允許使用關鍵字for browse和into。
--如果select_statement中的子句與所請求的游標類型的功能有衝突,則SQLServer會將游標隱式轉換為其他類型。

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

--update [of column_name [,...n]]
--定義游標中可更新的列。如果指定了of <column_name> [, <... n>],則只允許修改所列出的列。 如果指定了update,但未指定列的列表,則可以更新所有列。

示例

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

--第一種ISO語法
--游標使用三步曲
--第一步聲明游標
declare synae_cursor_name insensitive scroll cursor
for select id,name from test1
for read only;

示例結果

第二步打開游標

語法

open { { [ global  ] cursor_name } | cursor_variable_name }

語法解析

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

示例

open global synae_cursor_name;

示例結果

第三步使用游標

語法

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 last from synae_cursor_name into @id,@name;
select @id,@name;

示例結果

游標使用擴展

查看游標

語法

exec sp_cursor_list [ @cursor_return = ] cursor_variable_name output, [ @cursor_scope = ] cursor_scope [;] 

語法解析

--[@cursor_return=] cursor_variable_name 輸出
--已聲明的游標變數的名稱。 cursor_variable_name是游標,無預設值。 游標是可滾動、 動態、 只讀游標。

--[ @cursor_scope=] cursor_scope
--指定要報告的游標級別。 cursor_scope是int,無預設值,並且可以是下列值之一。
--@cursor_scope=1(local)(報告所有本地游標)
--@cursor_scope=2(global)(報告所有全局游標)
--@cursor_scope=3(global和local)(報告本地游標和全局游標)

示例

declare @result cursor
exec sp_cursor_list @cursor_return=@result output,@cursor_scope=2;
fetch next from @result;

示例結果

關閉游標

語法

close { { [ global ] cursor_name } | cursor_variable_name } 

語法解析

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

--cursor_name
--打開的游標的名稱。 當同時存在以cursor_name作為名稱的全局游標和局部游標時,如果指定global,則cursor_name 是指全局游標;否則,cursor_name 是指局部游標。

--cursor_variable_name
--與打開的游標關聯的游標變數的名稱。

示例

close global synae_cursor_name; 

示例結果

 刪除游標

語法

deallocate { { [ global ] cursor_name } | @cursor_variable_name } 

語法解析

--cursor_name
--已聲明游標的名稱。 當同時存在以 cursor_name 作為名稱的全局游標和局部游標時,如果指定 GLOBAL,則 cursor_name 指全局游標,如果未指定 GLOBAL,則指局部游標。
--@cursor_variable_name
--cursor 變數的名稱。 @cursor_variable_name必須為cursor類型。

示例

deallocate global synae_cursor_name;

示例結果

 


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

-Advertisement-
Play Games
更多相關文章
  • 資料庫中有A B C三列,用SQL語句實現:當A列大於B列時選擇A列否則選擇B列,當B列大於C列時選擇B列否則選擇C列。 方法一: 方法二: ...
  • 一個叫team的表,裡面只有一個欄位name,一共有4 條紀錄,分別是a、b、c、d,對應四個球隊,現在四個球隊進行比賽,用一條SQL語句顯示所有可能的比賽組合。 ...
  • 什麼是游標 結果集,結果集就是select查詢之後返回的所有行數據的集合。 游標則是處理結果集的一種機制吧,它可以定位到結果集中的某一行,多數據進行讀寫,也可以移動游標定位到你所需要的行中進行操作數據。 一般複雜的存儲過程,都會有游標的出現,他的用處主要有: 定位到結果集中的某一行。 對當前位置的數 ...
  • Select * From A Where id in(select ID from A group by id having count(id)>3) ...
  • 添加Redis相關jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> applicati ...
  • 在本機登入mysql後,更改"mysql"資料庫里的"user"表裡的"host"項,從"localhost"改為'%'。 代碼如下 mysql> mysql>use mysql; mysql>select 'host' from user where user='root'; #查看mysql庫中 ...
  • 例如 1.ROUND() 格式為ROUND(y1,y2,y3) y1:要被四捨五入的數字y2:保留的小數位數 y3:為0,可以不寫,y1進行四捨五入,不為0則y1不進入四捨五入,如果y1有值就直接根據y2保留小數 SELECT ROUND(10.45,0) --結果為10.00SELECT ROUN ...
  • Solr集群常用的操作總結 之前搭建過SolrCloud和Solr單機版本,另外還有很多對Solr配置文件以及核心的操作,以下主要總結Solr集群中的常用操作,即在配置文件中正確設置ZK_HOST參數並且Zookeeper正確啟動才是集群模式,一臺電腦也可以開啟集群模式,這裡集群是不包含測試實例的 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...