百度百科中的定義:
游標(Cursor)是處理數據的一種方法,為了查看或者處理結果集中的數據,游標提供了在結果集中一次一行或者多行前進或向后瀏覽數據的能力。可以把游標當作一個指針,它可以指定結果中的任何位置,然后允許用戶對指定位置的數據進行處理。
游標使用步驟:
一般地,使用游標都遵循下列的常規步驟:
(1) 聲明游標。把游標與T-SQL語句的結果集聯系起來。
(2) 打開游標。
(3) 使用游標操作數據。
(4) 關閉游標。
-
- 如何使用游標:
一般地,使用游標都遵循下列的常規步驟:
(1) 聲明游標。把游標與T-SQL語句的結果集聯系起來。
(2) 打開游標。
(3) 使用游標操作數據。
(4) 關閉游標。
2.1. 聲明游標
DECLARE CURSOR語句SQL-92標准語法格式:
DECLARE 游標名 [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR sql-statement
Eg:
Declare MycrsrVar Cursor
FOR Select * FROM tbMyData
2.2 打開游標
OPEN MycrsrVar
當游標被打開時,行指針將指向該游標集第1行之前,如果要讀取游標集中的第1行數據,必須移動行指針使其指向第1行。就本例而言,可以使用下列操作讀取第1行數據:
FETCH FIRST from E1cursor
或 FETCH NEXT from E1cursor
2.3 使用游標操作數據
下面的示例用@@FETCH_STATUS控制在一個WHILE循環中的游標活動
/* 使用游標讀取數據的操作如下。*/
DECLARE E1cursor cursor /* 聲明游標,默認為FORWARD_ONLY游標 */
FOR SELECT * FROM c_example
OPEN E1cursor /* 打開游標 */
FETCH NEXT from E1cursor /* 讀取第1行數據*/
WHILE @@FETCH_STATUS = 0 /* 用WHILE循環控制游標活動 */
BEGIN
FETCH NEXT from E1cursor /* 在循環體內將讀取其余行數據 */
END
- 如何使用游標:
CLOSE E1cursor /* 關閉游標 */
DEALLOCATE E1cursor /* 刪除游標 */
2.4 關閉游標
使用CLOSE語句關閉游標
CLOSE { { [ GLOBAL ] 游標名 } | 游標變量名 }
使用DEALLOCATE語句刪除游標,其語法格式如下:
DEALLOCATE { { [ GLOBAL ] 游標名 } | @游標變量名
3. FETCH操作的簡明語法如下:
FETCH
[ NEXT | PRIOR | FIRST | LAST]
FROM
{ 游標名 | @游標變量名 } [ INTO @變量名 [,…] ]
參數說明:
NEXT 取下一行的數據,並把下一行作為當前行(遞增)。由於打開游標后,行指針是指向該游標第1行之前,所以第一次執行FETCH NEXT操作將取得游標集中的第1行數據。NEXT為默認的游標提取選項。
INTO @變量名[,…] 把提取操作的列數據放到局部變量中。列表中的各個變量從左到右與游標結果集中的相應列相關聯。各變量的數據類型必須與相應的結果列的數據類型匹配或是結果列數據類型所支持的隱性轉換。變量的數目必須與游標選擇列表中的列的數目一致。
每執行一個FETCH操作之后,通常都要查看一下全局變量@@FETCH_STATUS中的狀態值,以此判斷FETCH操作是否成功。該變量有三種狀態值:
? 0 表示成功執行FETCH語句。
? -1 表示FETCH語句失敗,例如移動行指針使其超出了結果集。
? -2 表示被提取的行不存在。
由於@@FETCH_STATU是全局變量,在一個連接上的所有游標都可能影響該變量的值。因此,在執行一條FETCH語句后,必須在對另一游標執行另一FETCH 語句之前測試該變量的值才能作出正確的判斷。
更新數據;
declare my_youbiao cursor
for select * from t_msg
for update
open my_youbiao
fetch next from my_youbiao
while @@fetch_status=0
begin
–update t_msg set msg=’1234567890’ where current of my_youbiao
update my_youbiao set msg=’123’ where current of my_youbiao
fetch next from my_youbiao
print ‘asdfasd11’
end
close my_youbiao
deallocate my_youbiao
print ‘asdfasd’
測試通過:
–select * from master..sysprocesses
use test
declare my_cursor cursor scroll dynamic –scroll表示可以向前或向后移動 dynamic:表示可寫也可讀,
for
select F3 from temp –定義my_cursor 游標
open my_cursor –打開游標
declare @name nvarchar(128) –定義一個變量
fetch next from my_cursor into @name –游標停在第一條記錄前面,第一次執行,測試有沒有記錄存在
while(@@fetch_status=0) –取數據,直到-2即沒有記錄
begin
print ‘姓名: ’ + @name
–fetch next from my_cursor
fetch next from my_cursor into @name
end
–fetch first from my_cursor into @name
print @name
–update temp set F9=’zzg’ where current of my_cursor
/*// delete from 個人資料 where current of my_cursor */
close my_cursor
deallocate my_cursor