1. 為何使用游標: 使用游標(cursor)的一個主要的原因就是把集合操作轉換成單個記錄處理方式。用SQL語言從數據庫中檢索數據后,結果放在內存的一塊區域中,且結果往往是一個含有多個記錄的集合。游標機制允許用戶在SQL server內逐行地訪問這些記錄,按照用戶自己的意愿來顯示和處理這些記錄。
2. 如何使用游標: 一般地,使用游標都遵循下列的常規步驟: (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 /* 刪除游標 */ ? ? declare @id int,@name varchar(20); ? declare cur cursor fast_forward for ???? select id,name from a; ? open cur; ? fetch next from cur into @id,@name; ? while @@fetch_status=0 ? begin ????? --做你要做的事 ????? fetch next from cur into @id,@name; ? end ? close cur; ? deallocate cur;
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 @變量名1 變量類型1 Declare @變量名2 變量類型2 declare cur cursor fast_forward for select 字段名1,字段名2 from 表名1; open cur; fetch next from cur into @變量名1,@變量名2; while @@fetch_status=0 begin update 表名2 set 字段名1=@變量名1 whare 字段名2=@變量名2 fetch next from cur into @變量名1,@變量名2; end close cur; deallocate cur; 關閉提示 關閉確 認 取