<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
遊標是面向行的,它會使開發人員變懶,懶得去想用面向集合的查詢方式實現某些功能。
在效能上,遊標會吃更多的記憶體,減少可用的並行,佔用頻寬,鎖定資源,當然還有更多的程式碼量。用一個比喻來說明為什麼遊標會佔用更多的資源。當你從ATM機取款的時候,是一次取1000的效率更高呢,還是10次100呢?
遊標是非常邪惡的一種存在,使用遊標經常會比使用面向集合的方法慢2-3倍,當遊標定義在巨量資料量時,這個比例還會增加。如果可能,儘量使用while,子查詢,臨時表,函數,表變數等來替代遊標,記住,遊標永遠只是你最後無奈之下的選擇,而不是首選。
既然遊標那麼多缺點,為什麼要學習遊標呢?
遊標的定義語法:
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 ] ] ] [;]
在T-SQL中,定義一個遊標可以使非常簡單,也可以相對複雜,這主要取決於遊標的引數。而遊標的引數設定取決於你對遊標原理的瞭解程度。
遊標其實可以理解成一個定義在特定資料集上的指標,我們可以控制這個指標遍歷資料集,或者僅僅是指向特定的行,所以遊標是定義在以SELECT開始的資料集上的。
遊標分為遊標型別和遊標變數。
遊標變數支援兩種方式賦值,定義時賦值和先定義後賦值,定義遊標變數像定義其他區域性變數一樣,在遊標前加”@”。
注意,如果定義全域性的遊標,只支援定義時直接賦值,並且不能在遊標名稱前面加“@”。
兩種定義方式如下:
--定義後直接賦值 declare test_Cursor cursor for select * from Person; --先定義後賦值 declare @TEST_Cursor2 cursor; set @TEST_Cursor2 = cursor for select * from Person;
引數解釋:
如果不指定遊標作用域,預設作用域為GLOBAL。
--全域性遊標,跨GLOBAL declare test_Cursor cursor global for select * from Person; --區域性遊標,跨LOCAL declare test_Cursor2 cursor local for select * from Person; go --用GO結束上面的作用域 open test_Cursor; open test_Cursor2; --此行程式碼報錯,報遊標不存在,因此可以理解區域性遊標不跨批次處理,批次處理結束後,將被隱式釋放,無法在其他批次處理中呼叫
--不加引數,預設為Forward_Only declare test_Cursor cursor for select * from Person; --加Forward_Only declare test_Cursor2 cursor forward_only for select * from Person; --加SCROLL declare test_Cursor3 cursor scroll for select * from Person; open test_Cursor; open test_Cursor2; open test_Cursor3; fetch last from test_Cursor; --報錯 fetch: 提取型別 last 不能與只進遊標一起使用。 fetch last from test_Cursor2; --報錯 fetch: 提取型別 last 不能與只進遊標一起使用。 fetch last from test_Cursor3; --正確執行
這四個關鍵字是遊標所在資料集所反映的表資料和遊標讀取出資料的關係
當定義完遊標後,遊標需要開啟後使用,只需一行程式碼便可開啟遊標:
OPEN test_Cursor
注意,當全域性遊標和區域性遊標變數重名時,預設會開啟區域性變數遊標。
遊標的使用分為兩部分,一部分是操作遊標在資料集內的指向,另一部分是將遊標所指向的行的部分或全部內容進行操作。
支援6種移動導航,分別為:
例如:
declare test_Cursor cursor scroll for select name from Person; open test_Cursor; declare @c nvarchar(10); --取下一行 fetch next from test_Cursor into @c; print @c; --取最後一行 fetch last from test_Cursor into @c; print @c; --取第一行 fetch first from test_Cursor into @c; print @c; --取上一行 fetch prior from test_Cursor into @c; print @c; --取第三行 fetch absolute 3 from test_Cursor into @c; print @c; --取相對目前來說上一行 fetch relative -1 from test_Cursor into @c; print @c;
對於未指定SCROLL選項的遊標來說(未指定,則是隻進遊標),只支援NEXT取值。
遊標經常會和全域性變數@@FETCH_STATUS與WHILE迴圈來共同使用,以達到遍歷遊標所在資料集的目的。
當執行一條Fetch語句之後,@@Fetch_Status可能出現3種值:
遊標總記錄數 @@CURSOR_ROWS
例如:
declare test_Cursor cursor fast_forward for select id, name from Person; open test_Cursor; declare @id int; declare @name nvarchar(10); fetch next from test_Cursor into @id, @name; while @@FETCH_STATUS = 0 begin print @id; print @name; fetch next from test_Cursor into @id, @name; end; close test_Cursor; deallocate test_Cursor;
遊標修改當前行資料語法:
Update 基表名 Set 列名=值[,...] Where Current of 遊標名
遊標刪除當前數行據語法:
Delete 基表名 Where Current of 遊標名
舉例:
---1.宣告遊標 declare orderNum_03_cursor cursor scroll for select OrderId, userId from bigorder where orderNum = 'ZEORD003402'; --2.開啟遊標 open orderNum_03_cursor; --3.宣告遊標提取資料所要存放的變數 declare @OrderId int, @userId varchar(15); --4.定位遊標到哪一行 fetch first from orderNum_03_cursor into @OrderId, @userId; -- into的變數數量必須與遊標查詢結果集的列數相同 while @@fetch_status = 0 --提取成功,進行下一條資料的提取操作 begin if @OrderId = 122182 begin update bigorder set UserId = '123' where current of orderNum_03_cursor; --修改當前行 end; if @OrderId = 154074 begin delete bigorder where current of orderNum_03_cursor; --刪除當前行 end; fetch next from orderNum_03_cursor into @OrderId, @userId; --移動遊標 end; close orderNum_03_cursor; deallocate orderNum_03_cursor;
在遊標使用完之後,一定要記得關閉,只需要一行程式碼:CLOSE+遊標名稱
close test_Cursor
當遊標不再需要被使用後,釋放遊標,只需要一行程式碼:DEALLOCATE+遊標名稱
deallocate test_Cursor
到此這篇關於SQL Server遊標的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45