SQL Serverのストアド内でよく使用するのですが、変数@sqlなどにSELECT文を記述してその結果をダイレクトに別テーブルにINSERTしたいということがあります。
この場合は、以下のようにExec sp_executesql 変数名 で変数@sqlに入っているSELECT文が実行されその結果をINSERT INTO テーブル名で別のテーブルにINSERTされます。
基本構文
DECLARE @sql nvarchar(Max);
SET @sql='SELECT 項目名 FROM テーブル名'
INSERT INTO [INSERT先テーブル] EXEC sp_executesql @sql ;
;
注意書きメモ
- DECLARE @sql(変数名はなんでもOK)で変数のデータ型を設定(SQLが長くなるようならnvarchar(max)などにする。
- @sqlに入るSQLは‘SELECT ~‘シングルクォーテーションで括る。
- INSER先にテーブルも項目が一致している必要がある。
利用シーン
- ストアドやSQLで取得した大量の結果をそのまま別テーブルにINSERTするとき。
- テーブル名や条件などが動的なSQLを使いたいときに便利。
少し応用してみる
テーブル名に変数を代入したSQLの実行結果をINSERT
以下のようにテーブル名を変更したい場合は、以下のように書きます。
DECLARE @sql nvarchar(Max);
DECLARE @tablename nvarchar(50);
SET @tablename = 'テーブル名'
SET @sql='SELECT 項目名 FROM ' +@tablename
INSERT INTO [INSERT先テーブル] EXEC sp_executesql @sql ;
また、sp_executesqlを書かなくても以下のように書くこともできます。
DECLARE @TableName AS sysname = 'テーブル名'
Declare @Columns as sysname = '列名'
DECLARE @SQL as nvarchar(max) = 'select ' + @Columns + ' from ' + @TableName
print (@SQL)
INSERT INTO [INSERT先テーブル] EXEC (@SQL)
注意書きメモ
- 変数@sql内は、文字列なので変数の中に変数を記述する場合は、@tablenameの前でシングルクォーテーションを記述して文字列を終わらせて + @変数名を記述
- @変数の後にさらにSQL文が続く場合はシングルクォーテーションで再度括る。
コメント