結果集,結果集就是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...