カーソルに関して整理すると、MSDN には次の内容があります:
Transact-SQL サーバー カーソルを介して特定の行を取得します。
Parameters
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]
を使用すると、抽出操作の列データをローカル変数に配置できます。リスト内の各変数は、左から右にカーソル結果セット内の対応する列に関連付けられます。各変数のデータ型は、対応する結果セット列のデータ型と一致するか、結果セット列のデータ型でサポートされる暗黙的な変換である必要があります。変数の数は、カーソル選択リストの列の数と一致する必要があります。
コメント
ISO スタイルの DECLARE CURSOR ステートメントで SCROLL オプションが指定されていない場合、サポートされる 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 の使用
次の例では、姓が文字 B で始まる Person.Contact テーブルの行に対して単純なカーソルを宣言し、FETCH NEXT を使用してこれらの行を 1 つずつフェッチします。一つ。 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 ステートメントは、変数を 1 つの文字列に結合してクライアントに返します。
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 ] ]