Think Twice
IT技術メモ | SQL Serverのメモ
Created: 2021-09-10 / Updated: 2021-09-10

SQL ServerのT-SQLでテーブル変数を使う


T-SQLではテーブル変数というものが使えます。
これは内部的にはtempdbに作成されるようです。

目次


テーブル変数を宣言

以下のような構文で宣言します。

Copy
DECLARE @変数名 TABLE (
    <テーブル定義>
        :
        :
) 
以降、@変数名で定義した変数名をテーブルとして利用できるようになります。

Copy
DECLARE @id_tables TABLE (id nvarchar(16))

テーブル変数に値を設定

テーブル変数に値を設定するには、通常のテーブルと同じようにINSERT文を利用します。
上記で宣言した@id_tablesに値を設定するサンプルSQLは以下となります。

Copy
INSERT INTO @id_tables VALUES
  ('A001'),
  ('A004'),
  ('A008');

テーブル変数の値を参照

テーブル変数の値を参照する場合も、通常のテーブルと同じようにSELECT文を利用します。

Copy
SELECT * FROM @id_tables

結果

id
A001
A004
A008

通常のテーブルと同じように、JOINしたりも出来ます。

INNER JOINして使う
Copy
SELECT
    b.*
FROM
    @id_tables a
    INNER JOIN [dbo].[User] b ON b.Id = a.id
ORDER BY
    a.id DESC

テーブル変数の値を削除

お察しの通り、テーブル変数の値を削除する場合も、通常のテーブルと同じようにDELETE文を利用します。

Copy
DELETE FROM @id_tables WHERE id = 'A001'

上記例の状態の後、このDELETE文を実行した後は、以下のようになります。

結果 (削除後)

id
A004
A008

テーブル変数の値を取得し他の変数に設定

テーブル変数の値を取り出して、他の変数に設定することもできます。
取得するSQLはWHERE句TOP(x)で絞ったりして、データを一意にする必要があります。1

Copy
SET @変数名 = (<取得結果が一意になるSQL>)

Copy
SET @last_id = (SELECT TOP 1 id FROM @id_tables ORDER BY id DESC);

参考

関連メモ

参考サイト


  1. もし、複数の結果を返すSQLだと以下のようなエラーメッセージが出力されます。
    メッセージ 512、レベル 16、状態 1、行 14
    サブクエリは複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後に続く場合や、サブクエリが 1 つの式として使われる場合は複数の値は許可されません。 ↩︎