T-SQLではテーブル変数
というものが使えます。
これは内部的にはtempdb
に作成されるようです。
目次
テーブル変数を宣言
以下のような構文で宣言します。
DECLARE @変数名 TABLE ( <テーブル定義> : : )
@変数名
で定義した変数名をテーブルとして利用できるようになります。
例
DECLARE @id_tables TABLE (id nvarchar(16))
テーブル変数に値を設定
テーブル変数
に値を設定するには、通常のテーブルと同じようにINSERT文
を利用します。
上記で宣言した@id_tables
に値を設定するサンプルSQLは以下となります。
例
INSERT INTO @id_tables VALUES ('A001'), ('A004'), ('A008');
- なお、ここではSQL Serverで複数行INSERTするSQLを利用しています。
テーブル変数の値を参照
テーブル変数
の値を参照する場合も、通常のテーブルと同じようにSELECT文
を利用します。
例
SELECT * FROM @id_tables
結果
id |
---|
A001 |
A004 |
A008 |
通常のテーブルと同じように、JOINしたりも出来ます。
例
INNER JOINして使う
SELECT b.* FROM @id_tables a INNER JOIN [dbo].[User] b ON b.Id = a.id ORDER BY a.id DESC
- 特定のキー情報を
テーブル変数
にINSERTしておいて、こんな風にJOINして抽出することができたりして便利ですね。
テーブル変数の値を削除
お察しの通り、テーブル変数
の値を削除する場合も、通常のテーブルと同じようにDELETE文
を利用します。
例
DELETE FROM @id_tables WHERE id = 'A001'
上記例の状態の後、このDELETE文
を実行した後は、以下のようになります。
結果 (削除後)
id |
---|
A004 |
A008 |
A001
が削除されています。
テーブル変数の値を取得し他の変数に設定
テーブル変数
の値を取り出して、他の変数に設定することもできます。
取得するSQLはWHERE句
やTOP(x)
で絞ったりして、データを一意にする必要があります。1
SET @変数名 = (<取得結果が一意になるSQL>)
例
SET @last_id = (SELECT TOP 1 id FROM @id_tables ORDER BY id DESC);
参考
関連メモ
参考サイト
-
もし、複数の結果を返すSQLだと以下のようなエラーメッセージが出力されます。
メッセージ 512、レベル 16、状態 1、行 14
サブクエリは複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後に続く場合や、サブクエリが 1 つの式として使われる場合は複数の値は許可されません。 ↩︎