• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ストアドをまたがるローカル一時テーブル)

ストアドをまたがるローカル一時テーブル

このQ&Aのポイント
  • SQL Server 2005で作成したストアドプロシージャで、複数の同じ構造のローカル一時テーブル(テーブル名が#から始まる)を使用したいが、オブジェクトが無効なエラーが発生する。
  • グローバル一時テーブル(テーブル名が##から始まる)に変更すると動作するが、セッションをまたがって使用したくない。
  • ローカル一時テーブル作成SPを使用せずに、直接CREATEすれば動作するが、複数のSPで同じ構造のローカル一時テーブルを使用したいため、別SPにしたい。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

#1です。もう一つ代案を書いておきます。 質問者さんは、「テーブル作成SPを作って共用する」ということを考えておられるので、ストアドを1つ作る代わりにテンプレート用の実テーブルを1つ作るのも手かと思います。 ・一時テーブルのレイアウトのテーブル(TEMPLATETBL)を準備 ・一時テーブルを使うストアドでは、作成用のストアドを呼ぶ代わりに以下を実行する SELECT TOP 0 * INTO #TEMPTBL FROM TEMPLATETBL 効果はたぶん同じです。 (DROPはDROP TABLE #TEMPTBLですが、先に書いた通り無理に実行しなくても基本的に自動でDROPされます)

Inventory7
質問者

補足

ご丁寧な回答、どうもありがとうございます。 構造が同じテーブルを作成する方法を、ずっと探していましたが、 見つけられないでいました。 テストして見たところ、この方法で十分対応できそうです。 後は、この一時テーブルに対し、CLUSTERED INDEX を作成し、 使用したいと思います。 1回目に頂いた回答も、 このような方法があるとは知りませんでした。 これで、ストアド作成の幅が広がりそうです。 どうもありがとうございました。

その他の回答 (1)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

>ストアド プロシージャで作成されたローカル一時テーブルは、ストアド プロシージャが終了すると自動的に削除されます。テーブルは、そのテーブルを作成したストアド プロシージャによって実行される任意の入れ子になったストアド プロシージャから参照できます。テーブルは、そのテーブルを作成したストアド プロシージャを呼び出したプロセスから参照することはできません。 ・・と http://msdn.microsoft.com/ja-jp/library/ms174979(SQL.90).aspx に書かれております。 したがって、ストアド間をまたがって使いたいなら CREATE PROCEDURE sp_parentsp AS BEGIN SET NOCOUNT ON CREATE TABLE #TEMPTBL ([FLD1][.....) EXEC (#TEMPTBLを使うSP1) EXEC (#TEMPTBLを使うSP2) EXEC (#TEMPTBLを使うSP3) DROP TABLE #TEMPTBL END というように親のストアドで作成するしかありません。 したがって、CREAT/DROP部分を汎用化させる方法は各自の工夫次第です。あくまで一例として、その一時テーブルを使いたいSPをパラメータとして渡してしまうとか、です(あまりスマートとはいえませんが)。 CREATE PROCEDURE sp_parentsp(@execstr varchar(max)) AS BEGIN SET NOCOUNT ON CREATE TABLE #TEMPTBL ([FLD1][.....) EXEC (@execstr) DROP TABLE #TEMPTBL END EXEC sp_parentsp 'EXEC sp_selectsp1;EXEC sp_insertsp'

関連するQ&A