ホームページ  >  記事  >  php教程  >  SQLSERVER カーソルおよびループ ステートメント

SQLSERVER カーソルおよびループ ステートメント

高洛峰
高洛峰オリジナル
2016-12-14 11:30:461463ブラウズ

カーソルに関して整理すると、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 ] ]


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。