ストアドプロシージャの結果をテーブルに挿入する - INSERT INTO & EXEC
ストアドプロシージャの結果をテーブルに挿入する
ストアドプロシージャが返す結果をテーブルに挿入して、他のスクリプトで使いたいような時ありますよね。
ここでは、ストアドプロシージャの結果をテーブルに挿入する方法をご紹介します。
INSERT INTO [テーブル名] EXEC
ストアドプロシージャが返す結果セットのスキーマがわかっている場合は、先にテーブルを作っておくことによって、INSERT INTO & EXEC でそのテーブルに結果を挿入することができます。
例えば次のような、テーブル名を渡すと、カラムを返すストアドプロシージャ uspColumnListGet があります。
CREATE PROCEDURE uspColumnListGet @TableName NVARCHAR(128) AS BEGIN SElECT ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName ORDER BY ORDINAL_POSITION; END
この uspColumnListGet の実行結果を、#ColumnList という名前のテンポラリーテーブルに挿入するには、次のようにします。
CREATE TABLE #ColumnList ( ORDINAL_POSITION INT, COLUMN_NAME NVARCHAR(128), DATA_TYPE NVARCHAR(128) ); INSERT INTO #ColumnList EXEC uspColumnListGet 'Users'; SELECT * FROM #ColumnList;
まず、#ColumnList という名前のテンポラリーテーブルを作り、INSERT INTO & EXEC で uspColumnListGet の結果をテーブルに挿入しています。
テーブルは、結果セットとスキーマさえあえば、一時的ではないテーブルでも、テーブル変数でも大丈夫です。
ストアドプロシージャを変更して、結果セットにカラムをひとつ追加したりすると、忘れないように INSERT INTO & EXEC のほうのテーブルのスキーマも変更しないと、エラーになりますので気をつけてください。
ストアドプロシージャから返ってくる結果セットのスキーマがわからない場合や、事前にテーブルを生成したくない場合は OPENROWSET を使ってストアドプロシージャの結果からテーブルを生成することもできます。
詳しくはこちらをご覧ください。
ストアドプロシージャの結果からテーブルを生成する