ストアドプロシージャの結果をテーブルに挿入する - 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 を使ってストアドプロシージャの結果からテーブルを生成することもできます。
詳しくはこちらをご覧ください。 
 ストアドプロシージャの結果からテーブルを生成する