SQLServer之ISO游標使用

2021-09-24 07:21:01 字數 4524 閱讀 7468

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

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

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

定位到結果集中的某一行。

對當前位置的資料進行讀寫。

可以對結果集中的資料單獨操作,而不是整行執行相同的操作。

是面向集合的資料庫管理系統和面向行的程式設計之間的橋梁。

游標使用三步曲:第一步建立游標,第二步開啟游標,第三步使用游標。

--宣告資料庫引用

use 資料庫名;

go--建立游標

declare cursor_name [insensitive] [scroll] cursor

for select_statement

[for ];

--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 [, <... n>],則只允許修改所列出的列。 如果指定了update,但未指定列的列表,則可以更新所有列。

--宣告資料庫引用

use testss;

go--第一種iso語法

--游標使用三步曲

--第一步宣告游標

declare synae_cursor_name insensitive scroll cursor

for select id,name from test1

for read only;

open | 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 | relative ] from ] | @cursor_variable_name } [ into @variable_name [ ,...n ] ]

--next

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

--prior

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

--first

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

--last

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

--absolute

--如果 n 或 @nvar 為正,則返回從游標起始處開始向後的第 n 行,並將返回行變成新的當前行。

--如果 n 或 @nvar 為負,則返回從游標末尾處開始向前的第 n 行,並將返回行變成新的當前行。

--如果 n 或 @nvar 為 0,則不返回行。 n 必須是整數常量,並且 @nvar 必須是 smallint、tinyint 或 int。

--relative

--如果 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 | cursor_variable_name }

--global

--指定cursor_name是指全域性游標。

--cursor_name

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

--cursor_variable_name

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

close global synae_cursor_name;

deallocate | @cursor_variable_name }

--cursor_name

--已宣告游標的名稱。 當同時存在以 cursor_name 作為名稱的全域性游標和區域性游標時,如果指定 global,則 cursor_name 指全域性游標,如果未指定 global,則指區域性游標。

--@cursor_variable_name

--cursor 變數的名稱。 @cursor_variable_name必須為cursor型別。

deallocate global synae_cursor_name;

mysql游標很慢 Sqlserver 游標 慢

net專案中有個模組做統計功能,原先方法速度很慢,所以需要改進,統計結果如下圖 下圖接上圖後面 原先的處理方式是,這些資料分別涉及到四五張表,前台從資料庫中查詢出需要的資料集,然後分別遍歷這些資料集拼接html字串顯示在介面上。優化思考 net專案中有個模組做統計功能,原先方法速度很慢,所以需要改進...

SQL Server 游標使用

游標概念 資料庫操作中我們常常會遇到這樣情況,即從某一結果集中逐一地讀取一條記錄。那麼如何解決這種問題呢?游標為我們提供了一種極為優秀的解決方案。游標 cursor 是系統為使用者開設的乙個資料緩衝區,存放sql語句的執行結果。每個游標區都有乙個名字。使用者可以用sql語句逐一從游標中獲取記錄,並賦...

sqlserver游標使用

create procedure pk test as 宣告2個變數 declare o id nvarchar 20 declare a salary float 宣告乙個游標mycursor,select語句中引數的個數必須要和從游標取出的變數名相同 declare mycursor curso...