SQL Server のテーブル型の使い方を整理してみた

一応仕事で SQL Server は触っていて、テーブル型についても仕事で必要になった範囲でなんとなく使ってたんですけど、ちょっと応用したことをしようとしたらどう書けばいいのかわからなくなったので、自分の中で整理することにしました。

テーブル型変数の宣言

DECLARE @Table TABLE(
  Id int NOT NULL,
  Name varchar(20) NOT NULL
)

テーブル型変数を使った SELECT

SELECT * FROM @Table

テーブル型変数への INSERT

を使っての SELECT/INSERT/UPDATE/DELETE

INSERT INTO @Table VALUES(1, 'Hoge')

テーブル型変数の UPDATE

UPDATE @Table SET name = name + '1'

テーブル型変数の DELETE

DELETE FROM @Table

インラインテーブル値関数

RETURNS には TABLE とだけ書いて、ボディには BEGIN-END を書かず、RETURN に戻り値のクエリを書く。

CREATE FUNCTION dbo.InlineTableValued()
RETURNS TABLE
AS
RETURN
  SELECT 1 Id, 'Hoge' Name
  UNION ALL
  SELECT 2 Id, 'Fuga' Name
  UNION ALL
  SELECT 3 Id, 'Homu' Name
GO

SELECT * FROM dbo.InlineTableValued()

@Table

id name
1 Hoge
2 Fuga
3 Homu

複数ステートメントのテーブル値関数

RETURNS に戻り値として返すテーブル型変数を宣言して、ボディの最後には RETURN だけ書く。

CREATE FUNCTION dbo.MultiStatementTableValued()
RETURNS @Table TABLE (
  Id int NOT NULL,
  Name varchar(20) NOT NULL
)
AS
BEGIN

INSERT INTO @Table VALUES(1, 'Hoge')
INSERT INTO @Table VALUES(2, 'Fuga')
INSERT INTO @Table VALUES(3, 'Homu')

RETURN

END
GO

SELECT * FROM dbo.MultiStatementTableValued()

@Table

id name
1 Hoge
2 Fuga
3 Homu

プロシージャ内で発行したクエリの結果をテーブル型変数に INSERT する

CREATE PROCEDURE dbo.PROC1
AS
BEGIN
  SELECT 1 Id, 'Hoge' Name
  UNION ALL
  SELECT 2 Id, 'Fuga' Name
  UNION ALL
  SELECT 3 Id, 'Homu' Name
RETURN 0
END
GO

DECLARE @Table TABLE(
  Id int NOT NULL,
  Name varchar(20) NOT NULL
)

INSERT INTO @Table EXECUTE dbo.PROC1

SELECT * FROM @Table

@Table

id name
1 Hoge
2 Fuga
3 Homu