一連のテーブルから情報を抽出する必要がある SQL Server 2008 のストアド プロシージャを作成しています。これらのテーブルの構造を事前に知りません。同じデータベースに別のテーブルがあり、このテーブルのフィールドの名前とタイプを教えてくれます。
私はこれをやっています:
declare @sql nvarchar(max)
set @sql = 'select ... into #new_temporary_table ...'
exec sp_executesql @sql
Then I iterate doing:
set @sql = 'insert into #another_temporary_table ... select ... from #new_temporary_table'
exec sp_executesql @sql
その後、一時テーブルを削除します。これはループで発生するため、テーブルの作成、移入、および削除が何度も行われ、毎回異なる列が使用されます。
これはエラーで失敗します:
無効なオブジェクト名: #new_temporary_table。
いくつかのグーグルの後、私はそれを見つけました:
テーブルは、ストアド プロシージャのスコープとは異なる
#new_temporary_table
呼び出しのスコープで作成されています。exec sp_executesql
これが、nextexec sp_executesql
がテーブルを見つけられない理由です。この投稿ではそれについて説明しています: http://social.msdn.microsoft.com/forums/en-US/transactsql/thread/1dd6a408-4ac5-4193-9284-4fee8880d18a先頭に .が付加されたグローバル一時テーブルを使用できます
##
。複数のストアド プロシージャが同時に実行される可能性があり、それらが互いの状態に影響を与える可能性があるため、これを行うことはできません。この記事では、この状況に陥った場合、データベースの構造を変更する必要があると述べています。これは私にとってオプションではありません: http://www.sommarskog.se/dynamic_sql.html
私が見つけた 1 つの回避策はselect into #new_temporary_table..
、すべてのinsert into ...
スクリプトを 1 つの巨大なステートメントに結合することでした。これはうまく機能しますが、いくつかの欠点があります。
たとえば、トラブルシューティングのために @sql を出力すると、テキストが切り捨てられます。
他に選択肢はありますか?すべてのアイデアを歓迎します。