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 ステートメントは不要です。- 複数のレコードが検索された場合、最後のレコードの値が変数に代入されます。
- 条件に一致するレコードが存在しない場合、通常は変数の値は変更されません。ただし、MAX や MIN などの集計関数を使用すると必ず結果を返すため、条件に一致するレコードが存在しない場合でも変数の値が変更されます。
- 変数への代入と結果の出力は混在できないため、エラーになります。
--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
--変数の出力結果にカラム名を指定
SELECT @PlayerName AS PlayerName
,@Score AS Score
PRINT関数 で確認
PRINT関数 は、文字列リテラル や 変数 を引数として受け取り、その結果を出力します。 PRINT関数 は主にデバッグで使用され、クライアントにメッセージとして返されます。SQL Server Management Studioでは、メッセージタブ内に表示されます。以下に、PRINT関数 を使用して変数の内容を表示する例を示します。
--PRINT で変数の値を確認
PRINT '--変数の値を確認--'
PRINT @PlayerName
PRINT @Score

変数の活用
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
サンプルコードのダウンロード
- サンプルコードは Microsoft SQL Server 2022 Express Edition (64-bit) で動作確認を行っております。
- SQL Server のバージョンよっては、エラーが発生することがあります。
- サンプルコードのダウンロードや実行によって損害等が発生した場合、理由の如何に関わらず、当方は一切責任を負いません。
ダウンロードリンク
参考資料
- Microsoft公式ドキュメント - 変数 (Transact-SQL)
- Microsoft公式ドキュメント - DECLARE
- Microsoft公式ドキュメント - SET
- Microsoft公式ドキュメント - PRINT
- Microsoft公式ドキュメント - SELECT
検証環境
- Microsoft SQL Server 2022 (RTM-CU10) (KB5031778) - 16.0.4095.4 (X64) Oct 30 2023 16:12:44 Copyright (C) 2022 Microsoft Corporation Express Edition (64-bit) on Linux (Ubuntu 22.04.3 LTS) <X64>
- Docker image: mcr.microsoft.com/mssql/server:2022-latest
- Docker Desktop 4.25.2 (129061)
- Docker Engine Engine: 24.0.6
- Docker Compose v2.23.0-desktop.1
- Microsoft SQL Server Management Studio v19.0.1(19.0.20200.0+9286509b)
- Windows 10 Enterprise Version 22H2 OS Build 19045.3930 Experience: Windows Feature Experience Pack 1000.19053.1000.0