SET @local_variable (Transact-SQL)

DECLARE **@**local_variable ステートメントを使用して既に作成してある指定のローカル変数に、指定した値を設定します。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

SET 
{ @local_variable 
    [:: property_name | field_name ] = expression | udt_name { . | :: } method_name(argument [ ,...n ] ) 
}
| 
{ @cursor_variable = 
    { @cursor_variable | cursor_name 
    | { CURSOR [ FORWARD_ONLY | SCROLL ] 
        [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] 
        [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] 
        [ TYPE_WARNING ] 
    FOR select_statement 
        [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ] 
      } 
    }
} 

引数

**@**local_variable

cursortextntextimage、または table を除く、任意の型の変数の名前を指定します。変数名の先頭には 1 つのアット マーク (@) を指定します。変数名は、識別子の規則に従っている必要があります。

property_name

ユーザー定義型のプロパティを指定します。

field_name

ユーザー定義型のパブリック フィールドを指定します。

udt_name

共通言語ランタイム (CLR) ユーザー定義型の名前を指定します。

{ . | :: }

CLR ユーザー定義型のメソッドを指定します。静的メソッド以外のインスタンス メソッドでは、ピリオド (.) を使用します。静的メソッドでは、2 つのコロン (::) を使用します。CLR ユーザー定義型のメソッド、プロパティ、またはフィールドを呼び出すには、その型に対する EXECUTE 権限が必要です。

method_name**(**argument [ ,... n ] )

ユーザー定義型のメソッドを指定します。このメソッドでは、あるデータ型のインスタンスの状態を変更する場合に 1 つ以上の引数を使用します。静的メソッドはパブリックであることが必要です。

expression

有効なを指定します。

cursor_variable

カーソル変数の名前を指定します。ターゲットのカーソル変数が以前に他のカーソルを参照していた場合は、以前の参照は削除されます。

cursor_name

DECLARE CURSOR ステートメントを使用して宣言したカーソルの名前を指定します。

CURSOR

SET ステートメントにカーソルの宣言が含まれることを指定します。

SCROLL

カーソルで、すべてのフェッチ オプション (FIRST、LAST、NEXT、PRIOR、RELATIVE、および ABSOLUTE) がサポートされることを指定します。FAST_FORWARD も指定した場合、SCROLL は指定できません。

FORWARD_ONLY

カーソルで、FETCH NEXT オプションだけがサポートされることを指定します。カーソルは、最初の行から最後の行への一方向にしか取得できません。STATIC、KEYSET、DYNAMIC のいずれのキーワードも指定しないで FORWARD_ONLY を指定した場合、カーソルは DYNAMIC として実装されます。FORWARD_ONLY も SCROLL も指定しなかった場合は、STATIC、KEYSET、または DYNAMIC キーワードを指定しない限り、FORWARD_ONLY が既定値になります。STATIC、KEYSET、および DYNAMIC カーソルの既定値は SCROLL です。

ms189484.note(ja-jp,SQL.90).gifメモ :
SQL Server 2000 では、FAST_FORWARD と FORWARD_ONLY カーソル オプションは同時に指定できません。どちらか一方のみを指定でき、両方指定するとエラーが発生します。SQL Server 2005 では、両方のキーワードを同じ DECLARE CURSOR ステートメントで使用できます。

STATIC

データの一時コピーを作成するためのカーソルを定義します。作成されるコピーは、カーソルで使用されます。このカーソルに対する要求の応答は、すべて tempdb 内にある一時テーブルから取得されます。したがって、ベース テーブルへの修正は、このカーソルで取得したデータには反映されません。また、このカーソルで修正を行うこともできません。

KEYSET

カーソルをオープンするときに、カーソル内の行の構成要素と順序が固定されることを指定します。行を一意に識別するキーのセットは、tempdb 内の keyset テーブルに組み込まれます。ベース テーブル内にあるキー以外の値に対する変更が、カーソル所有者によって実行されるか、または他のユーザーによってコミットされると、その変更は、カーソル所有者がカーソルの周囲をスクロールするときに表示されます。他のユーザーによって行われた挿入は表示されません。Transact-SQL サーバー カーソルを介して、挿入を行うことはできません。

行が削除された場合、その行をフェッチしようとすると、@@FETCH_STATUS が -2 に設定されて返されます。カーソルの外部からのキー値の更新は、古い行を削除した後で新しい行を挿入する場合と同様に、新しい値を含む行は表示されず、古い値を含む行を取得しようとすると、@@FETCH_STATUS が -2 に設定されて返されます。WHERE CURRENT OF 句を指定し、カーソルを介して更新を行うと、新しい値が表示されます。

DYNAMIC

結果セット内の行に対して行ったすべてのデータ変更を反映するカーソルを定義します。このデータ変更は、カーソル所有者がカーソルの周囲をスクロールするときに行われたものです。行のデータ値、順序、構成要素は、各フェッチ操作で変化する可能性があります。動的カーソルでは、絶対フェッチ オプションと相対フェッチ オプションはサポートされません。

FAST_FORWARD

最適化が有効に設定された FORWARD_ONLY、READ_ONLY カーソルを指定します。SCROLL も指定した場合、FAST_FORWARD は指定できません。

ms189484.note(ja-jp,SQL.90).gifメモ :
SQL Server 2000 では、FAST_FORWARD と FORWARD_ONLY カーソル オプションは同時に指定できません。どちらか一方のみを指定でき、両方指定するとエラーが発生します。SQL Server 2005 では、両方のキーワードを同じ DECLARE CURSOR ステートメントで使用できます。

READ_ONLY

このカーソルによる更新を禁止します。UPDATE または DELETE ステートメントの WHERE CURRENT OF 句で、カーソルを参照することはできません。このオプションは、更新対象のカーソルの既定の機能よりも優先されます。

SCROLL LOCKS

カーソルによって行われる位置指定更新または位置指定削除は、確実に成功します。SQL Server では、後続の変更で行を使用できるようにするために、カーソルに読み取られるときに行がロックされます。FAST_FORWARD を指定した場合、SCROLL_LOCKS は指定できません。

OPTIMISTIC

行がカーソルに読み取られてから更新された場合に、カーソルによって行われる位置指定更新または位置指定削除が失敗します。SQL Server では、行がカーソルに読み取られるとき、その行はロックされません。代わりに timestamp 列の値を比較するか、テーブルに timestamp 列がない場合はチェックサム値を使用して、行がカーソルに読み込まれてから変更されたかどうかが判別されます。行が変更されている場合、位置指定更新または位置指定削除の試行は失敗します。FAST_FORWARD も指定した場合、OPTIMISTIC は指定できません。

TYPE_WARNING

カーソルの種類が、要求されたものから別のものに暗黙的に変換された場合、クライアントに警告メッセージが送信されます。

FOR select_statement

カーソルの結果セットを定義する標準の SELECT ステートメントです。COMPUTE、COMPUTE BY、FOR BROWSE、および INTO キーワードは、カーソル宣言の select_statement では使用できません。

select_list で、DISTINCT、UNION、GROUP BY、HAVING のいずれかが使用されるか、集計式が含まれる場合、カーソルは STATIC として作成されます。

基になる各テーブルに一意なインデックスがなく、SQL-92 SCROLL カーソルまたは Transact-SQL KEYSET カーソルが要求された場合、カーソルは自動的に STATIC カーソルになります。

select_statement に、列が一意な行識別子になっていない ORDER BY 句が含まれる場合、DYNAMIC カーソルは KEYSET カーソルに変換されます。KEYSET カーソルをオープンできない場合、DYNAMIC カーソルは STATIC カーソルに変換されます。STATIC キーワードを指定せず、SQL-92 の構文を使用して定義されたカーソルの場合も、同様の変換が行われます。

READ ONLY

このカーソルによる更新を禁止します。UPDATE または DELETE ステートメントの WHERE CURRENT OF 句で、このカーソルを参照することはできません。このオプションは、更新対象のカーソルの既定の機能よりも優先されます。このキーワードは、以前は READ_ONLY と表記していましたが、今後は、READ と ONLY の間にアンダースコアではなくスペースを指定するようになりました。

UPDATE [OF column_name[ ,... n ] ]

カーソル内で更新できる列を定義します。OF column_name [,...n] を指定した場合は、一覧で指定した列だけを変更できます。一覧を指定しなかった場合は、カーソルを READ ONLY として定義していない限り、すべての列を更新できます。

解説

変数は宣言後、NULL に初期化されます。宣言された変数に NULL 以外の値を代入するには、SET ステートメントを使用します。変数に値を代入する SET ステートメントでは、1 つの値が返されます。複数の変数を初期化する場合は、各ローカル変数に対して 1 つずつ、SET ステートメントを使用してください。

変数は式の内部だけで使用でき、オブジェクト名やキーワードの代わりに使用することはできません。動的 Transact-SQL ステートメントを作成するには、EXECUTE を使用します。

SET **@**cursor_variable の構文規則に、LOCAL キーワードと GLOBAL キーワードは含まれません。SET **@**cursor_variable = CURSOR... 構文を使用すると、カーソルは default to local cursor データベース オプションの設定に応じて、GLOBAL または LOCAL として作成されます。

カーソル変数は、グローバル カーソルを参照する場合でも、常にローカルです。カーソル変数でグローバル カーソルを参照する場合、カーソルに対してグローバル カーソル参照とローカル カーソル参照の両方が行われます。詳細については、例 C を参照してください。

詳細については、「DECLARE CURSOR (Transact-SQL)」を参照してください。

権限

public ロールのメンバシップが必要です。すべてのユーザーが、SET **@**local_variable を使用できます。

A. SET によって初期化された変数の値を出力する

次の例では、@myvar 変数を作成し、文字列値を代入して、@myvar 変数の値を出力します。

DECLARE @myvar char(20);
SET @myvar = 'This is a test';
SELECT @myvar;
GO

B. SET によって値が代入されたローカル変数を、SELECT ステートメントで使用する

次の例では、@state という名前のローカル変数を作成し、このローカル変数を SELECT ステートメントで使用して、Oregon 州に住む全従業員の姓名を検索します。

USE AdventureWorks;
GO
DECLARE @state char(25);
SET @state = N'Oregon';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name, City
FROM HumanResources.vEmployee
WHERE StateProvinceName = @state;

C. グローバル カーソルに対して SET を使用する

次の例では、ローカル変数を作成した後、カーソル変数をグローバル カーソル名に設定します。

DECLARE my_cursor CURSOR GLOBAL 
FOR SELECT * FROM Purchasing.ShipMethod
DECLARE @my_variable CURSOR ;
SET @my_variable = my_cursor ; 
--There is a GLOBAL cursor declared(my_cursor) and a LOCAL variable
--(@my_variable) set to the my_cursor cursor.
DEALLOCATE my_cursor; 
--There is now only a LOCAL variable reference
--(@my_variable) to the my_cursor cursor.

D. SET を使用してカーソルを定義する

次の例では、SET ステートメントを使用してカーソルを定義します。

DECLARE @CursorVar CURSOR;

SET @CursorVar = CURSOR SCROLL DYNAMIC
FOR
SELECT LastName, FirstName
FROM AdventureWorks.HumanResources.vEmployee
WHERE LastName like 'B%';

OPEN @CursorVar;

FETCH NEXT FROM @CursorVar;
WHILE @@FETCH_STATUS = 0
BEGIN
    FETCH NEXT FROM @CursorVar
END;

CLOSE @CursorVar;
DEALLOCATE @CursorVar;

E. クエリから値を代入する

次の例では、クエリを使用して変数に値を代入します。

USE AdventureWorks;
GO
DECLARE @rows int;
SET @rows = (SELECT COUNT(*) FROM Sales.Customer);
SELECT @rows;

F. ユーザー定義型のプロパティを変更してユーザー定義型変数に値を代入する

次の例では、ユーザー定義型の Point に対して X プロパティの値を変更し、値を設定します。

DECLARE @p Point;
SET @p.X = @p.X + 1.1;
SELECT @p;
GO

G. ユーザー定義型のメソッドを起動してユーザー定義型変数に値を代入する

次の例では、ユーザー定義型の point に対して SetXY メソッドを起動し、値を設定します。

DECLARE @p Point;
SET @p=point.SetXY(23.5, 23.5);

参照

関連項目

DECLARE @local\_variable (Transact-SQL)
EXECUTE (Transact-SQL)
SELECT (Transact-SQL)
SET (Transact-SQL)

その他の技術情報

式 (データベース エンジン)
変数とパラメータの使用 (データベース エンジン)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手