テーブル型変数の利用 - SQL Server

結果セットを格納できる、テーブル型変数について紹介します。

概要

SQL Serverでは、結果のレコードセットを格納できるテーブル型変数を宣言して利用できます。
この記事では、テーブル型変数の利用方法を紹介します。

書式

テーブル変数の宣言は次の書式です。
DECLARE @[テーブル型変数名] TABLE(
 [列名1] [型名1]
 ,[列名2] [型名2]
 ...
 ,[列名n] [型名n]
)

記述例

DECLARE @myitem TABLE(
 id int
 ,name varchar(16)
 ,price int
)

テーブル変数の操作

作成したテーブル変数のレコードの挿入や更新は通常のテーブルと同じ操作で実行できます。
以下の記事を参照してください。

例1

次のSQL文を実行します。
DECLARE @myitem TABLE(
 id int IDENTITY(1,1) NOT NULL
 ,name varchar(16)
 ,price int
)

INSERT INTO @myitem (name,price) VALUES('しろくまアイス',330)
INSERT INTO @myitem (name,price) VALUES('かるがもサブレ',160)

SELECT * FROM @myitem

解説

DECLARE でテーブル変数型の変数@myitemを宣言します。
DECLARE @myitem TABLE(
 id int IDENTITY(1,1) NOT NULL
 ,name varchar(16)
 ,price int
)

INSERT文を実行し、@myitem 変数にレコードを挿入します。
INSERT INTO @myitem (name,price) VALUES('しろくまアイス',330)
INSERT INTO @myitem (name,price) VALUES('かるがもサブレ',160)

SELECT文で @myitem 変数の内容を表示します。
SELECT * FROM @myitem

実行結果

SQL文を実行すると、以下の結果となります。
idnameprice
1しろくまアイス330
2かるがもサブレ160

例2

次のテーブルを準備します。
Products テーブル
idmodelnameclasscategoryprice
1C-XM01モーダンチェアホームチェア56000
2X-XD05ラージデスクオフィステーブル87000
3A-DA40ラウンドダイニングチェアホームチェア28000
4O-XX100ナチュラルオフィスオフィスチェア13800
5R-D400ラウンドダイニングテーブルホームテーブル128000
6R7000ウッドキャビネットオフィスその他32000
7B-200リネンベッドホームベッド184500
8B-250ホワイトダブルベッドホームベッド324850
9W-80ワーキングチェアオフィスチェア45000
10EG-10Xエルゴノミクスデスクオフィステーブル88500
11OC-908オーガニックチェアホームチェア56000
次のSQL文を実行します。
DECLARE @choice TABLE(
 cid int
)

INSERT INTO @choice (cid) VALUES(4),(6),(8),(10)

SELECT * FROM Products where id IN @choice 

解説

DECLARE でテーブル変数型の変数@choiceを宣言します。
DECLARE @choice TABLE(
 cid int
)

INSERT文を実行し、@choice 変数にレコードを挿入します。
INSERT INTO @choice (cid) VALUES(4),(6),(8),(10)

Productsテーブルから、@choice 変数に挿入した値のidのレコードを取り出します。
SELECT * FROM Products where id IN @choice 

実行結果

SQLを実行すると以下の結果となります。
@choice 変数に設定した id=4, 6, 8, 10 のレコードが選択されます。
idmodelnameclasscategoryprice
4O-XX100ナチュラルオフィスオフィスチェア13800
6R7000ウッドキャビネットオフィスその他32000
8B-250ホワイトダブルベッドホームベッド324850
10EG-10Xエルゴノミクスデスクオフィステーブル88500

一時テーブルとの違い

似た機能として、一時テーブルがありますが、テーブル型変数は変数のため、 テーブル型変数を宣言した、バッチ、関数、ストアドプロシージャー内でのみ有効です。バッチや関数、ストアドプロシージャーの終了時にテーブル型変数は破棄されます。
また、テーブル変数では大きなテーブルや複雑なクエリではパフォーマンスが低下する場合があるため、 複雑なテーブルや処理を一時的に使用したい場合は、一時テーブルを使用したほうがパフォーマンスが良くなります。
テーブルのサイズが小さい場合や繰り返し再利用しない場合は、テーブル変数のほうが適しています。

著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
最終更新日: 2023-12-09
作成日: 2023-03-29
iPentec all rights reserverd.