FETCH (Transact-SQL)
從 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 設為負數來指定 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]
-
可讓提取的資料行資料放在本機變數中。清單中的各個變數會由左至右,依次關聯於資料指標結果集中對應的資料行。每個變數的資料類型都必須符合對應結果集資料行的資料類型,或必須是支援的對應結果集資料行的資料類型之隱含轉換。變數的數目必須符合資料指標選取清單中的資料行數目。
如果 SQL-92 樣式 DECLARE CURSOR 陳述式並未指定 SCROLL 選項,NEXT 就是唯一支援的 FETCH 選項。如果在 SQL-92 樣式 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>。
A. 在簡單資料指標中使用 FETCH
這個範例宣告 Person.Contact 資料表中,各個姓氏開頭是 B 的資料列之簡單資料指標,且利用 FETCH NEXT 來逐步執行各個資料列。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,將值儲存在變數中
這個範例類似於上一個範例,不過,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 選項的完整捲動功能。
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

