【SQLServer】sp_executesqlで変数にセットしたSELECT 結果をINSERT

SQL
スポンサーリンク

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文が続く場合はシングルクォーテーションで再度括る。

コメント

タイトルとURLをコピーしました