SQL Server - 変数の使い方 - 宣言、値の代入、活用方法など

SQL Server の変数の使い方を解説します。変数の宣言方法、値の確認方法、表示方法、活用方法について、具体的なサンプルコードを交えて説明します。

変数の宣言

--変数の宣言
DECLARE @<変数名> <変数の型>
--初期値を指定して変数の宣言
DECLARE @<変数名> <変数の型> = <初期値>
--複数の変数をまとめて宣言
DECLARE @<変数名> <変数の型>
       ,@<変数名> <変数の型>
       ,@<変数名> <変数の型>
--初期値を指定し、複数の変数をまとめて宣言
DECLARE @<変数名> <変数の型> = <初期値>
       ,@<変数名> <変数の型> = <初期値>
       ,@<変数名> <変数の型> = <初期値>

変数の宣言方法

変数を宣言するには DECLARE ステートメントを使用します。変数名は @(アットマーク) で始まる必要があり、変数名の後に データ型 を指定します。

次のサンプルコードは @age という名前で、INT型の変数を宣言します。

--INT型の変数「@age」を宣言
DECLARE @age INT

変数の初期値を設定

変数を宣言する際に、= 演算子を使用して初期値を設定することができます。初期値を明示的に設定しない場合、その変数の値は NULL になります。
--初期値を指定して変数を宣言
DECLARE @CountryName VARCHAR(100) = 'United States'
DECLARE @CountryCode INT = 1

複数の変数を一度に宣言

カンマ(,)を使用すると、一つの DECLARE ステートメントで複数の変数を一度に宣言することができます。また、= 演算子を使用して各変数に初期値を設定することも可能です。ただし、各変数に対して初期値を個別に設定する必要があります。

以下に、複数の変数を一度に宣言する例を示します。

--変数をまとめて宣言
DECLARE @RoomType   VARCHAR(100)
       ,@RoomNumber INT

--変数をまとめて宣言し、初期値を設定
DECLARE @PlayerName VARCHAR(100) = 'Player1'
       ,@Score INT = 95

変数に値を代入

--変数に値を代入
SET @<変数名> = <値>

--変数の値をコピー
SET @<変数名> = @<変数名>
--ストアドファンクション(関数)の戻り値を代入
SET @<変数名> = <ストアドファンクション名>()
--テーブルのカラム値を代入
SELECT @<変数名> = <列名> FROM <テーブル名>

変数に値を代入する方法

変数に値を代入するには、SET ステートメントと = 演算子を使用します。この方法は、既に宣言された変数に値を設定するために使用されます。

次のサンプルコードでは、@PlayerName という変数に 'Player2' を代入します。

--変数「@PlayerName」に 'Player2' を代入
SET @PlayerName = 'Player2'

SELECT結果を変数に代入

SELECT句の中で 列名 の前に 変数と = 演算子を指定することで、変数に値を代入できます。この場合、SET ステートメントは不要です。
--SELECT結果を変数に代入
SELECT @ObjectName = name
  FROM sys.objects

--集計関数の結果を変数に代入
SELECT @MaxObjectId = MAX(object_id)
      ,@MinObjectId = MIN(object_id)
  FROM sys.objects  

変数の内容を確認

SELECT @<変数名>
PRINT @<変数名>

SELECT で確認

SELECT文では、カラム名を指定するのと同じように、変数を指定できます。 以下に、SELECTステートメントを使用して変数の内容を表示する例を示します。
--SELECT文を使用して変数の値を出力
SELECT @PlayerName, @Score
また、ASキーワードを使用して、出力結果のカラム名を指定することもできます。以下にその例を示します。
--変数の出力結果にカラム名を指定
SELECT @PlayerName AS PlayerName
      ,@Score      AS Score

PRINT関数 で確認

PRINT関数 は、文字列リテラル や 変数 を引数として受け取り、その結果を出力します。 PRINT関数 は主にデバッグで使用され、クライアントにメッセージとして返されます。SQL Server Management Studioでは、メッセージタブ内に表示されます。

以下に、PRINT関数 を使用して変数の内容を表示する例を示します。

--PRINT で変数の値を確認
PRINT '--変数の値を確認--'
PRINT @PlayerName
PRINT @Score
イメージ
SQL Server Management Studio - メッセージタブ

変数の活用

SQL Serverでは、変数は様々な方法で活用することができます。以下に、条件分岐と検索条件に変数を使用する例を示します。

条件分岐に使用する

IFステートメントを使用して、変数の値に基づいた条件分岐を行うことができます。 以下に、変数 @pointの値によって条件分岐をする例を示します。
--INT型の変数「@point」を宣言し、50 を代入
DECLARE @point INT = 50

--IF文を使用し、条件分岐
IF @point >= 50 BEGIN
	SELECT '50点以上です。'
END ELSE BEGIN
	SELECT '50点未満です。'
END

検索条件に使用する

SELECTステートメントのWHERE句内で変数を使用することで、動的な検索条件を作成することができます。以下に、@object_idという変数の値に基づいてsys.objectsテーブルからレコードを検索する例を示します。
--INT型の変数「@object_id」を宣言し、50 を代入
DECLARE @object_id INT = 50

--sys.objects テーブルから、object_id の値が 50以上のレコードを検索する
SELECT *
  FROM sys.objects
  WHERE object_id >= @object_id

変数のスコープ

変数のスコープとは、その変数を参照できる範囲です。変数のスコープは、その変数が宣言された時点で始まり、変数が宣言されたバッチやストアドプロシージャが終了した時点で終了します。例えば、ある関数を呼び出したあと、その関数内で宣言された変数は参照できません。

トランザクション

変数への変更はトランザクションの影響を受けません。つまり、トランザクションがロールバックされても、そのトランザクション内で行われた変数への代入や変更はそのまま保持されます。

以下に、トランザクション開始後に変数に値を代入し、その後でトランザクションをロールバックする例を示します。この例では、変数への変更がトランザクションのロールバックの影響を受けないことを確認できます。

--トランザクション開始
BEGIN TRAN

--変数を宣言
DECLARE @PlayerName VARCHAR(100)
       ,@Score INT

--変数に値を代入
SET @PlayerName = 'Player2'
SET @Score = 80

--トランザクションのロールバック
ROLLBACK

--変数の内容を確認
SELECT @PlayerName AS PlayerName   --結果 = 'Player2'
      ,@Score      AS Score        --結果 = 80

サンプルコードのダウンロード

ダウンロードリンク

参考資料

検証環境

関連ページ

改訂履歴