FETCH (Transact-SQL)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Microsoft Fabric SQL Database
Transact-SQL サーバー カーソルから特定の行を取得します。
構文
FETCH
[ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE { n | @nvar }
| RELATIVE { n | @nvar }
]
FROM
]
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }
[ INTO @variable_name [ ,...n ] ]
引数
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_variable_name
フェッチが行われる、開いているカーソルを参照するカーソル変数の名前です。
INTO @variable_name[ ,...n]
フェッチの列で得られたデータを、ローカル変数に設定します。 リスト内の各変数は、左から右に向かって、カーソル結果セット内の対応する列に関連付けられます。 各変数のデータ型は、対応する結果セット列のデータ型に一致するか、または暗黙的な型変換がサポートされていなければなりません。 変数の個数は、カーソル選択リスト内の列の個数と一致している必要があります。
解説
SCROLL
オプションが ISO 形式のDECLARE CURSOR
ステートメントで指定されていない場合、サポートされる FETCH
オプションは NEXT
のみです。 ISO 形式の DECLARE CURSOR
で SCROLL
が指定されている場合、すべての FETCH
オプションがサポートされます。
Transact-SQL DECLARE カーソル拡張が使用されると、次のルールが適用されます。
FORWARD_ONLY
またはFAST_FORWARD
のいずれかが指定されている場合、サポートされるFETCH
オプションはNEXT
のみです。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.Person
テーブル内の姓が B
で始まる行に対して単純カーソルを宣言し、FETCH NEXT
を使用して行を順番に移動します。 FETCH
ステートメントは、DECLARE CURSOR
の中で指定された列の値を、単一行の結果セットとして返します。
USE AdventureWorks2022;
GO
DECLARE contact_cursor CURSOR FOR
SELECT LastName FROM Person.Person
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
ステートメントは変数を 1 つの文字列に結合し、これをクライアントに返します。
USE AdventureWorks2022;
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.Person
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 AdventureWorks2022;
GO
-- Execute the SELECT statement alone to show the
-- full result set that is used by the cursor.
SELECT LastName, FirstName FROM Person.Person
ORDER BY LastName, FirstName;
-- Declare the cursor.
DECLARE contact_cursor SCROLL CURSOR FOR
SELECT LastName, FirstName FROM Person.Person
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
参照
CLOSE (Transact-SQL)
DEALLOCATE (Transact-SQL)
DECLARE CURSOR (Transact-SQL)
OPEN (Transact-SQL)