DECLARE (Transact-SQL)DECLARE (Transact-SQL)

適用対象: ○SQL Server (2008 以降) ○Azure SQL Database ○Azure SQL Data Warehouse ○Parallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

変数は、バッチやプロシージャの中で DECLARE ステートメントを使用して宣言し、SET ステートメントまたは SELECT ステートメントを使用して値を割り当てます。Variables are declared in the body of a batch or procedure with the DECLARE statement and are assigned values by using either a SET or SELECT statement. このステートメントでは、他のカーソル関連のステートメントで使用できるカーソル変数を宣言できます。Cursor variables can be declared with this statement and used with other cursor-related statements. 宣言の一部として値を指定しない場合、宣言の後、すべての変数は NULL として初期化されます。After declaration, all variables are initialized as NULL, unless a value is provided as part of the declaration.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions


-- Syntax for SQL Server and Azure SQL Database  

    { @local_variable [AS] data_type  [ = value ] }  
  | { @cursor_variable_name CURSOR }  
} [,...n]   
| { @table_variable_name [AS] <table_type_definition> }   

<table_type_definition> ::=   
     TABLE ( { <column_definition> | <table_constraint> } [ ,...n] )   

<column_definition> ::=   
     column_name { scalar_data_type | AS computed_column_expression }  
     [ COLLATE collation_name ]   
     [ [ DEFAULT constant_expression ] | IDENTITY [ (seed ,increment ) ] ]   
     [ ROWGUIDCOL ]   
     [ <column_constraint> ]   

<column_constraint> ::=   
     { [ NULL | NOT NULL ]   
     | [ PRIMARY KEY | UNIQUE ]   
     | CHECK ( logical_expression )   
     | WITH ( <index_option > )  

<table_constraint> ::=   
     { { PRIMARY KEY | UNIQUE } ( column_name [ ,...n] )   
     | CHECK ( search_condition )   

<index_option> ::=  
See CREATE TABLE for index option syntax.  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

{{ @local_variable [AS] data_type } [ =value [ COLLATE <collation_name> ] ] } [,...n]  


変数名を指定します。Is the name of a variable. 変数名は、アット マーク (@) で始める必要があります。Variable names must begin with an at (@) sign. ローカル変数名は、識別子の規則に従っている必要があります。Local variable names must comply with the rules for identifiers.

システム提供の共通言語ランタイム (CLR) ユーザー定義テーブル型または別名データ型を指定します。Is any system-supplied, common language runtime (CLR) user-defined table type, or alias data type. 変数のデータ型としては textntextimage を指定できません。A variable cannot be of text, ntext, or image data type.

システム データ型の詳細については、「データ型 (Transact-SQL)」を参照してください。For more information about system data types, see Data Types (Transact-SQL). CLR ユーザー定義型または別名データ型の詳細については、「CREATE TYPE (Transact-SQL)」を参照してください。For more information about CLR user-defined types or alias data types, see CREATE TYPE (Transact-SQL).

インラインで値を変数に代入します。Assigns a value to the variable in-line. 値には定数または式を指定できますが、変数宣言の型と同じであるか、その型に暗黙的に変換できる必要があります。The value can be a constant or an expression, but it must either match the variable declaration type or be implicitly convertible to that type. 詳細については、「式 (Transact-SQL)」を参照してください。For more information, see Expressions (Transact-SQL).

カーソル変数の名前を指定します。Is the name of a cursor variable. カーソル変数名はアット マーク (@) で始まり、識別子の規則に従っている必要があります。Cursor variable names must begin with an at (@) sign and conform to the rules for identifiers.

変数がローカルなカーソル変数であることを指定します。Specifies that the variable is a local cursor variable.

table 型の変数の名前です。Is the name of a variable of type table. 変数名はアット マーク (@) で始まり、識別子の規則に従っている必要があります。Variable names must begin with an at (@) sign and conform to the rules for identifiers.

table データ型を定義します。Defines the table data type. テーブルの定義には、列の定義、名前、データ型、および制約が含まれます。The table declaration includes column definitions, names, data types, and constraints. 指定できる制約の種類は、PRIMARY KEY、UNIQUE、NULL、および CHECK のみです。The only constraint types allowed are PRIMARY KEY, UNIQUE, NULL, and CHECK. 別名データ型にルールや既定の定義がバインドされている場合、別名データ型を列のスカラー データ型として使用することはできません。An alias data type cannot be used as a column scalar data type if a rule or default definition is bound to the type.

<table_type_definition> は、CREATE TABLE でテーブルを定義するときに使用する情報のサブセットです。<table_type_definiton> Is a subset of information used to define a table in CREATE TABLE. これには要素と必須の定義が含まれます。Elements and essential definitions are included here. 詳細については、「CREATE TABLE (Transact-SQL)」を参照してください。For more information, see CREATE TABLE (Transact-SQL).

複数の変数を指定し、値を割り当てることができることを示すプレースホルダーです。Is a placeholder indicating that multiple variables can be specified and assigned values. table 変数を宣言する場合、1 つの DECLARE ステートメント内に table 変数以外の変数を定義することはできません。When declaring table variables, the table variable must be the only variable being declared in the DECLARE statement.

テーブル内の列名を指定します。Is the name of the column in the table.

列がスカラー データ型であることを指定します。Specifies that the column is a scalar data type.

計算列の値を定義する式を指定します。Is an expression defining the value of a computed column. 計算列は、同じテーブルの他の列を使用した式によって計算されます。It is computed from an expression using other columns in the same table. たとえば、計算列は cost AS price * qty として定義されます。この式には、計算列以外の列の名前、定数、組み込み関数、変数、およびこれらを 1 つ以上の演算子で結合した組み合わせを使用できます。For example, a computed column can have the definition cost AS price * qty. The expression can be a noncomputed column name, constant, built-in function, variable, or any combination of these connected by one or more operators. この式はサブクエリまたはユーザー定義関数にはできません。The expression cannot be a subquery or a user-defined function. この式は CLR ユーザー定義型を参照できません。The expression cannot reference a CLR user-defined type.

[ COLLATE collation_name][ COLLATE collation_name]
列の照合順序を指定します。Specifies the collation for the column. collation_name には、Windows の照合順序名か SQL の照合順序名を指定できます。これは、データ型が charvarchartextncharnvarcharntext の列にだけ適用できます。collation_name can be either a Windows collation name or an SQL collation name, and is applicable only for columns of the char, varchar, text, nchar, nvarchar, and ntext data types. collation_name を指定しないと、列がユーザー定義データ型である場合はユーザー定義データ型の照合順序、または現在のデータベースの照合順序が列に割り当てられます。If not specified, the column is assigned either the collation of the user-defined data type (if the column is of a user-defined data type) or the collation of the current database.

Windows と SQL の照合順序名については、「COLLATE (Transact-SQL)」を参照してください。For more information about the Windows and SQL collation names, see COLLATE (Transact-SQL).

挿入の際に明示的な値を指定しない場合に、列に入力される値を指定します。Specifies the value provided for the column when a value is not explicitly supplied during an insert. DEFAULT 定義は、timestamp として定義された列または IDENTITY プロパティを持つ列以外のすべての列に適用できます。DEFAULT definitions can be applied to any columns except those defined as timestamp or those with the IDENTITY property. テーブルが削除されると、DEFAULT 定義も削除されます。DEFAULT definitions are removed when the table is dropped. 既定値として使用できるのは、文字列などの定数値、SYSTEM_USER() などのシステム関数、または NULL だけです。Only a constant value, such as a character string; a system function, such as a SYSTEM_USER(); or NULL can be used as a default. SQL ServerSQL Server の旧バージョンとの互換性を保つため、DEFAULT に制約名を割り当てることができます。To maintain compatibility with earlier versions of SQL ServerSQL Server, a constraint name can be assigned to a DEFAULT.

列の既定値として使用される定数、NULL またはシステム関数を指定します。Is a constant, NULL, or a system function used as the default value for the column.

新しい列が ID 列であることを指定します。Indicates that the new column is an identity column. テーブルに行が新しく追加されると、 SQL ServerSQL Server では列に一意な増分値が設定されます。When a new row is added to the table, SQL ServerSQL Server provides a unique incremental value for the column. ID 列は通常、PRIMARY KEY 制約と組み合わせて使用し、テーブルの一意な行識別子 (ROWID) の役割を果たします。Identity columns are commonly used in conjunction with PRIMARY KEY constraints to serve as the unique row identifier for the table. IDENTITY プロパティは、tinyintsmallintintdecimal(p,0)numeric(p,0) のいずれかの列に割り当てることができます。The IDENTITY property can be assigned to tinyint, smallint, int, decimal(p,0), or numeric(p,0) columns. ID 列は 1 つのテーブルにつき 1 つだけ作成できます。Only one identity column can be created per table. バインドされた既定値および DEFAULT 制約を ID 列と組み合わせて使用することはできません。Bound defaults and DEFAULT constraints cannot be used with an identity column. seed と increment は、両方を指定するか、どちらも指定しないでください。You must specify both the seed and increment, or neither. どちらも指定しないときの既定値は (1,1) です。If neither is specified, the default is (1,1).

テーブルに読み込まれる最初の行に使用される値です。Is the value used for the very first row loaded into the table.

既に読み込まれている前の行の ID 値に加算される増分値です。Is the incremental value added to the identity value of the previous row that was loaded.

新しい列が行グローバル一意識別子列であることを指定します。Indicates that the new column is a row global unique identifier column. 1 つのテーブルにつき、1 つの uniqueidentifier 列だけを ROWGUIDCOL 列に指定できます。Only one uniqueidentifier column per table can be designated as the ROWGUIDCOL column. ROWGUIDCOL プロパティは uniqueidentifier 列にだけ割り当てることができます。The ROWGUIDCOL property can be assigned only to a uniqueidentifier column.

変数で NULL 値が許可されるかどうかを示します。Indicates if null is allowed in the variable. 既定値は NULL です。The default is NULL.

特定の 1 つ以上の一意なインデックスによって列にエンティティの整合性を強制する制約です。Is a constraint that enforces entity integrity for a given column or columns through a unique index. PRIMARY KEY 制約は、1 つのテーブルにつき 1 つだけ作成できます。Only one PRIMARY KEY constraint can be created per table.

一意なインデックスによって、特定の 1 つ以上の列に対してエンティティの整合性を設定する制約です。Is a constraint that provides entity integrity for a given column or columns through a unique index. 1 つのテーブルには複数の UNIQUE 制約を指定できます。A table can have multiple UNIQUE constraints.

1 つ以上の列に入力できる値を制限することによってドメインの整合性を設定する制約です。Is a constraint that enforces domain integrity by limiting the possible values that can be entered into a column or columns.

TRUE または FALSE を返す論理式です。Is a logical expression that returns TRUE or FALSE.


変数は、バッチやプロシージャの中で、WHILE、LOOP、または IF...ELSE ブロックのカウンターとして使用される場合があります。Variables are often used in a batch or procedure as counters for WHILE, LOOP, or for an IF...ELSE block.

変数は式の内部だけで使用できます。オブジェクト名やキーワードの代わりに使用することはできません。Variables can be used only in expressions, not in place of object names or keywords. 動的 SQL ステートメントを作成するには、EXECUTE を使用します。To construct dynamic SQL statements, use EXECUTE.

ローカル変数のスコープは、その変数が宣言されるバッチです。The scope of a local variable is the batch in which it is declared.

テーブル変数は、必ずしもメモリ常駐ではありません。A table variable is not necessarily memory resident. メモリ不足の場合、テーブル変数に属するページは tempdb に移動します。Under memory pressure, the pages belonging to a table variable can be pushed out to tempdb.

現在カーソルが割り当てられているカーソル変数は、次のステートメントの中でソースとして参照できます。A cursor variable that currently has a cursor assigned to it can be referenced as a source in a:

  • CLOSE ステートメントCLOSE statement.

  • DEALLOCATE ステートメントDEALLOCATE statement.

  • FETCH ステートメントFETCH statement.

  • OPEN ステートメントOPEN statement.

  • 位置指定の DELETE または UPDATE ステートメントPositioned DELETE or UPDATE statement.

  • SET CURSOR 変数ステートメント (右側)SET CURSOR variable statement (on the right side).

    どのステートメントの場合も、参照されるカーソル変数は存在するが、現在カーソルが割り当てられていない場合は、 SQL ServerSQL Server でエラーが発生します。In all of these statements, SQL ServerSQL Server raises an error if a referenced cursor variable exists but does not have a cursor currently allocated to it. 参照されているカーソル変数が存在しない場合、 SQL ServerSQL Server では、宣言されていない別の型の変数に対して発生するエラーと同じエラーが発生します。If a referenced cursor variable does not exist, SQL ServerSQL Server raises the same error raised for an undeclared variable of another type.

    カーソル変数には、次の特徴があります。A cursor variable:

  • カーソルの種類または別のカーソル変数の対象になります。Can be the target of either a cursor type or another cursor variable. 詳細については、「SET @local_variable (Transact-SQL)」を参照してください。For more information, see SET @local_variable (Transact-SQL).

  • カーソル変数に現在カーソルが割り当てられていない場合、EXECUTE ステートメント内の出力カーソル パラメーターの対象として参照できます。Can be referenced as the target of an output cursor parameter in an EXECUTE statement if the cursor variable does not have a cursor currently assigned to it.

  • カーソルへのポインターとして扱われます。Should be regarded as a pointer to the cursor.



次の例では、@find という名前のローカル変数を使って、Man で始まるすべての姓の連絡先情報を取得します。The following example uses a local variable named @find to retrieve contact information for all last names beginning with Man.

USE AdventureWorks2012;  
DECLARE @find varchar(30);   
/* Also allowed:   
DECLARE @find varchar(30) = 'Man%';   
SET @find = 'Man%';   
SELECT p.LastName, p.FirstName, ph.PhoneNumber  
FROM Person.Person AS p   
JOIN Person.PersonPhone AS ph ON p.BusinessEntityID = ph.BusinessEntityID  
WHERE LastName LIKE @find;  

以下に結果セットを示します。Here is the result set.

LastName            FirstName               Phone
------------------- ----------------------- -------------------------
Manchepalli         Ajay                    1 (11) 500 555-0174
Manek               Parul                   1 (11) 500 555-0146
Manzanares          Tomas                   1 (11) 500 555-0178

(3 row(s) affected)

B.B. DECLARE で 2 つの変数を使用するUsing DECLARE with two variables

次の例では、北米販売区域に勤務しており、年間売上高が $2,000,000 以上である Adventure Works CyclesAdventure Works Cycles 販売担当者の名前を取得します。The following example retrieves the names of Adventure Works CyclesAdventure Works Cycles sales representatives who are located in the North American sales territory and have at least $2,000,000 in sales for the year.

USE AdventureWorks2012;  
DECLARE @Group nvarchar(50), @Sales money;  
SET @Group = N'North America';  
SET @Sales = 2000000;  
SELECT FirstName, LastName, SalesYTD  
FROM Sales.vSalesPerson  
WHERE TerritoryGroup = @Group and SalesYTD >= @Sales;  

C.C. table 型の変数を宣言するDeclaring a variable of type table

次の例では、UPDATE ステートメントの OUTPUT 句で指定される値を格納する table 変数を作成します。The following example creates a table variable that stores the values specified in the OUTPUT clause of the UPDATE statement. この後に、SELECT 内の値、および @MyTableVar テーブルの更新操作の結果を返す 2 つの Employee ステートメントが続きます。Two SELECT statements follow that return the values in @MyTableVar and the results of the update operation in the Employee table. INSERTED.ModifiedDate 列の結果が、Employee テーブルの ModifiedDate 列の値と異なることに注意してください。Note that the results in the INSERTED.ModifiedDate column differ from the values in the ModifiedDate column in the Employee table. これは、AFTER UPDATE の値を現在の日付に更新する ModifiedDate トリガーが、Employee テーブルで定義されるためです。This is because the AFTER UPDATE trigger, which updates the value of ModifiedDate to the current date, is defined on the Employee table. ただし、OUTPUT が返す列には、トリガーが起動される前の値が反映されています。However, the columns returned from OUTPUT reflect the data before triggers are fired. 詳細については、を参照してください。 OUTPUT 句と #40 です。TRANSACT-SQL と #41;.For more information, see OUTPUT Clause (Transact-SQL).

USE AdventureWorks2012;  
DECLARE @MyTableVar table(  
    EmpID int NOT NULL,  
    OldVacationHours int,  
    NewVacationHours int,  
    ModifiedDate datetime);  
UPDATE TOP (10) HumanResources.Employee  
SET VacationHours = VacationHours * 1.25   
INTO @MyTableVar;  
--Display the result set of the table variable.  
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate  
FROM @MyTableVar;  
--Display the result set of the table.  
--Note that ModifiedDate reflects the value generated by an  
--AFTER UPDATE trigger.  
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate  
FROM HumanResources.Employee;  

D.D. ユーザー定義テーブル型の変数を宣言するDeclaring a variable of user-defined table type

次の例では、@LocationTVP というテーブル値パラメーターまたはテーブル変数を作成します。The following example creates a table-valued parameter or table variable called @LocationTVP. これには、LocationTableType という対応するユーザー定義テーブル型が必要です。This requires a corresponding user-defined table type called LocationTableType. ユーザー定義テーブル型の作成方法の詳細については、「CREATE TYPE (Transact-SQL)」を参照してください。For more information about how to create a user-defined table type, see CREATE TYPE (Transact-SQL). テーブル値パラメーターの詳細については、「テーブル値パラメーターの使用 (データベース エンジン)」を参照してください。For more information about table-valued parameters, see Use Table-Valued Parameters (Database Engine).

DECLARE @LocationTVP   
AS LocationTableType;  

例: Azure SQL データ ウェアハウスAzure SQL Data Warehouse および Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL データ ウェアハウスAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse


次の例では、@find という名前のローカル変数を使って、Walt で始まるすべての姓の連絡先情報を取得します。The following example uses a local variable named @find to retrieve contact information for all last names beginning with Walt.

-- Uses AdventureWorks  

DECLARE @find varchar(30);  
/* Also allowed:   
DECLARE @find varchar(30) = 'Man%';  
SET @find = 'Walt%';  

SELECT LastName, FirstName, Phone  
FROM DimEmployee   
WHERE LastName LIKE @find;  

F.F. DECLARE で 2 つの変数を使用するUsing DECLARE with two variables

次の例では、変数を使用し、DimEmployee テーブルにある従業員の名と姓を指定します。The following example retrieves uses variables to specify the first and last names of employees in the DimEmployee table.

-- Uses AdventureWorks  

DECLARE @lastName varchar(30), @firstName varchar(30);  

SET @lastName = 'Walt%';  
SET @firstName = 'Bryan';  

SELECT LastName, FirstName, Phone  
FROM DimEmployee   
WHERE LastName LIKE @lastName AND FirstName LIKE @firstName;  

参照See Also

EXECUTE (Transact-SQL) EXECUTE (Transact-SQL)
組み込み関数 (Transact-SQL) Built-in Functions (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
テーブル (Transact-SQL) table (Transact-SQL)
型指定された XML と型指定されていない XML の比較Compare Typed XML to Untyped XML