整理一下,關於遊標,MSDN有:
過 Transact-SQL 伺服器遊標檢索特定行。
參數
NEXT
緊跟著當前行返回結果行,並且當前行遞增為返回行。如果 FETCH NEXT 為對遊標的第一次擷取操作,則傳回結果集中的第一行。 NEXT 為預設的遊標提取選項。
PRIOR
返回緊鄰當前行前面的結果行,並且當前行遞減為返回行。如果 FETCH PRIOR 為對遊標的第一次擷取操作,則沒有行回傳且遊標置於第一行之前。
FIRST
返回遊標中的第一行並將其作為當前行。
LAST
返回遊標中的最後一行並將其作為當前行。
ABSOLUTE { n | @nvar}
如果 n 或 @nvar 為正,則返回從遊標頭開始向後的第 n 行,並將返回行變成新的目前行。如果 n 或 @nvar為負,則傳回從遊標末端開始向前的第 n 行,並將返回行變成新的目前行。如果 n 或 @nvar 為 0,則不回傳行。 n 必須是整數常數,且 @nvar 的資料型別必須為 smallint、tinyint 或 int。
RELATIVE { n | @nvar}
如果 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_name 指的是局部遊標。
@ cursor_variable_name
遊標變數名,引用要從中進行提取操作的開啟的遊標。
INTO @variable_name[ ,...n]
允許將擷取作業的資料列資料放到局部變數中。清單中的各個變數從左到右與遊標結果集中的對應列相關聯。各變數的資料類型必須與對應的結果集列的資料類型匹配,或是結果集列資料類型所支援的隱式轉換。變數的數目必須與遊標選擇清單中的列數一致。
註解
如果 SCROLL 選項未在 ISO 樣式的 DECLARE CURSOR 語句中指定,則 NEXT 是唯一支援的 FETCH 選項。如果在 ISO 樣式的 DECLARE CURSOR 語句中指定了 SCROLL 選項,則支援所有 FETCH 選項。
如果使用 Transact-SQL DECLARE 遊標擴充插件,則套用下列規則:
如果指定了 FORWARD_ONLY 或 FAST_FORWARD,則 NEXT 是唯一支援的 FETCH 選項。
如果未指定 DYNAMIC、FORWARD_ONLY 或 FAST_FORWARD 選項,並且指定了 KEYSET、STATIC 或 SCROLL 中的某一個,則支援所有 FETCH 選項。
DYNAMIC SCROLL 遊標支援除 ABSOLUTE 以外的所有 FETCH 選項。
@@FETCH_STATUS 函數會報告上一個 FETCH 語句的狀態。相同的資訊記錄在由 sp_describe_cursor 傳回的遊標中的 fetch_status 欄位中。這些狀態資訊應該用於在對由 FETCH 語句傳回的資料進行任何操作之前,以確定這些資料的有效性。有關詳細信息,請參閱 @@FETCH_STATUS (Transact-SQL)。
權限
FETCH 權限預設會授予任何有效的使用者。
範例
A. 在簡單的遊標中使用 FETCH
以下範例為 Person.Contact 表中姓氏以 FEB 開頭的行宣告了一個簡單的遊標,並使用這些遊標FETCH 語句以單行結果集形式傳回 DECLARE CURSOR 中指定的資料列的值。
USE AdventureWorks GO DECLARE contact_cursor CURSOR FOR SELECT LastName FROM Person.Contact WHERE LastName LIKE 'B%' ORDER BY LastName OPEN contact_cursor -- Perform the first fetch. FETCH NEXT FROM contact_cursor -- Check @@FETCH_STATUS to see if there are any more rows to fetch. WHILE @@FETCH_STATUS = 0 BEGIN -- This is executed as long as the previous fetch succeeds. FETCH NEXT FROM contact_cursor END CLOSE contact_cursor DEALLOCATE contact_cursor GO
B. 使用 FETCH 將值存入變數
以下範例與範例 A 相似,但 FETCH 語句的輸出儲存於局部變數而不是直接回到客戶端。 PRINT 語句將變數組合成單一字串並傳回客戶端。
USE AdventureWorks GO -- Declare the variables to store the values returned by FETCH. DECLARE @LastName varchar(50), @FirstName varchar(50) DECLARE contact_cursor CURSOR FOR SELECT LastName, FirstName FROM Person.Contact WHERE LastName LIKE 'B%' ORDER BY LastName, FirstName OPEN contact_cursor -- Perform the first fetch and store the values in variables. -- Note: The variables are in the same order as the columns -- in the SELECT statement. FETCH NEXT FROM contact_cursor INTO @LastName, @FirstName -- Check @@FETCH_STATUS to see if there are any more rows to fetch. WHILE @@FETCH_STATUS = 0 BEGIN -- Concatenate and display the current values in the variables. PRINT 'Contact Name: ' + @FirstName + ' ' + @LastName -- This is executed as long as the previous fetch succeeds. FETCH NEXT FROM contact_cursor INTO @LastName, @FirstName END CLOSE contact_cursor DEALLOCATE contact_cursor GO
C. 聲明 SCROLL 遊標並使用其他 FETCH 選項
以下示例创建一个 SCROLL 游标,使其通过 LAST、PRIOR、RELATIVE 和 ABSOLUTE 选项支持全部滚动功能。
。
另外,再举一个简单的例子:
Declare @Id varchar(20)
Declare @Name varchar(20)
Declare Cur Cursor For
select substring(id,0,7) as id,name from temp1
Open Cur
Fetch next From Cur Into @Id,@Name
While @@fetch_status=0
Begin
Update temp Set [c3]=@Name where [id] like @Id+'%'
Fetch Next From Cur Into @Id,@Name
End
Close Cur
Deallocate Cur
简单的FOR循环等:
declare @i int
set @i=0
while @i<10
begin
set @i = @i+1
end
SQL SERVER不支持FOR循环
USE AdventureWorks GO -- Execute the SELECT statement alone to show the -- full result set that is used by the cursor. SELECT LastName, FirstName FROM Person.Contact ORDER BY LastName, FirstName -- Declare the cursor. DECLARE contact_cursor SCROLL CURSOR FOR SELECT LastName, FirstName FROM Person.Contact ORDER BY LastName, FirstName OPEN contact_cursor -- Fetch the last row in the cursor. FETCH LAST FROM contact_cursor -- Fetch the row immediately prior to the current row in the cursor. FETCH PRIOR FROM contact_cursor -- Fetch the second row in the cursor. FETCH ABSOLUTE 2 FROM contact_cursor -- Fetch the row that is three rows after the current row. FETCH RELATIVE 3 FROM contact_cursor -- Fetch the row that is two rows prior to the current row. FETCH RELATIVE -2 FROM contact_cursor CLOSE contact_cursor DEALLOCATE contact_cursor GO
语法
FETCH [ [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE { n | @nvar } | RELATIVE { n | @nvar } ] FROM ] { { [ GLOBAL ] cursor_name } | @cursor_variable_name } [ INTO @variable_name [ ,...n ] ]