SET @local_variable (Transact-SQL)
DECLARE @local_variable ステートメントを使用して既に作成してある指定のローカル変数に、指定した値を設定します。
構文
SET
{ @local_variable
[ . { property_name | field_name } ] = { expression | udt_name { . | :: } method_name }
}
|
{ @SQLCLR_local_variable.mutator_method
}
|
{ @local_variable
{+= | -= | *= | /= | %= | &= | ^= | |= } expression
}
|
{ @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
cursor、text、ntext、image、または table を除く、任意の型の変数の名前を指定します。変数名の先頭には 1 つのアット マーク (@) を指定します。変数名は、識別子の規則に従っている必要があります。property_name
ユーザー定義型のプロパティを指定します。field_name
ユーザー定義型のパブリック フィールドを指定します。udt_name
共通言語ランタイム (CLR) ユーザー定義型の名前を指定します。{ . | :: }
CLR ユーザー定義型のメソッドを指定します。静的メソッド以外のインスタンス メソッドでは、ピリオド (.) を使用します。静的メソッドでは、2 つのコロン (::) を使用します。CLR ユーザー定義型のメソッド、プロパティ、またはフィールドを呼び出すには、その型に対する EXECUTE 権限が必要です。method_name ( argument [ ,... n ] )
ユーザー定義型のメソッドを指定します。このメソッドでは、あるデータ型のインスタンスの状態を変更する場合に 1 つ以上の引数を使用します。静的メソッドはパブリックであることが必要です。@SQLCLR_local_variable
型がアセンブリに存在する変数を指定します。詳細については、「CLR (共通言語ランタイム) 統合のプログラミング概念」を参照してください。mutator_method
オブジェクトの状態を変更できるアセンブリのメソッドを指定します。このメソッドには SQLMethodAttribute.IsMutator が適用されます。{ += | -= | *= | /= | %= | &= | ^= | |= }
複合代入演算子です。+= 加算して代入
-= 減算して代入
*= 乗算して代入
/= 除算して代入
%= 剰余を代入
&= ビットごとの AND 演算を行って代入
^= ビットごとの XOR 演算を行って代入
|= ビットごとの OR 演算を行って代入
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 です。注 SQL Server 2000 では、FAST_FORWARD と FORWARD_ONLY カーソル オプションは同時に指定できません。どちらか一方のみを指定でき、両方指定するとエラーが発生します。両方のキーワードを同じ 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 は指定できません。注 SQL Server 2000 では、FAST_FORWARD と FORWARD_ONLY カーソル オプションは同時に指定できません。どちらか一方のみを指定でき、両方指定するとエラーが発生します。両方のキーワードを同じ 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 として作成されます。
基になる各テーブルに一意なインデックスがなく、ISO SCROLL カーソルまたは Transact-SQL KEYSET カーソルが要求された場合、カーソルは自動的に STATIC カーソルになります。
select_statement に、列が一意な行識別子になっていない ORDER BY 句が含まれる場合、DYNAMIC カーソルは KEYSET カーソルに変換されます。KEYSET カーソルを開くことができない場合、DYNAMIC カーソルは STATIC カーソルに変換されます。STATIC キーワードを指定せず、ISO 構文を使用して定義されたカーソルの場合も、同様の変換が行われます。
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)」を参照してください。
複合代入演算子は、変数や、UPDATE、SELECT、および RECEIVE ステートメントの SET など、演算子の右側にある式で代入を行う任意の場所で使用できます。
権限
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 AdventureWorks2008R2;
GO
DECLARE @state char(25);
SET @state = N'Oregon';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name, City
FROM HumanResources.vEmployee
WHERE StateProvinceName = @state;
C. ローカル変数に対して複合代入を使用する
次の 2 つの例では、同じ結果が生成されます。どちらも @NewBalance というローカル変数を作成し、その値に 10 を乗算して、SELECT ステートメントでローカル変数の新しい値を表示します。2 番目の例では、複合代入演算子を使用します。
/* Example one */
DECLARE @NewBalance int ;
SET @NewBalance = 10;
SET @NewBalance = @NewBalance * 10;
SELECT @NewBalance;
/* Example Two */
DECLARE @NewBalance int = 10;
SET @NewBalance *= 10;
SELECT @NewBalance;
D. グローバル カーソルに対して 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.
E. SET を使用してカーソルを定義する
次の例では、SET ステートメントを使用してカーソルを定義します。
DECLARE @CursorVar CURSOR;
SET @CursorVar = CURSOR SCROLL DYNAMIC
FOR
SELECT LastName, FirstName
FROM AdventureWorks2008R2.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;
F. クエリから値を代入する
次の例では、クエリを使用して変数に値を代入します。
USE AdventureWorks2008R2;
GO
DECLARE @rows int;
SET @rows = (SELECT COUNT(*) FROM Sales.Customer);
SELECT @rows;
G. ユーザー定義型のプロパティを変更してユーザー定義型変数に値を代入する
次の例では、ユーザー定義型の Point に対して X プロパティの値を変更し、値を設定します。
DECLARE @p Point;
SET @p.X = @p.X + 1.1;
SELECT @p;
GO
H. ユーザー定義型のメソッドを起動してユーザー定義型変数に値を代入する
次の例では、ユーザー定義型の Point に対して SetXY メソッドを起動し、値を設定します。
DECLARE @p Point;
SET @p=point.SetXY(23.5, 23.5);
I. CLR 型の変数を作成してミューテーター メソッドを呼び出す
次の例では、Point 型の変数を作成し、Point のミューテーター メソッドを実行します。
CREATE ASSEMBLY mytest from 'c:\test.dll' WITH PERMISSION_SET = SAFE
CREATE TYPE Point EXTERNAL NAME mytest.Point
GO
DECLARE @p Point = CONVERT(Point, '')
SET @p.SetXY(22, 23);