SQL Server 2005 でストアドプロシージャ(以降SPと省略)
を作成しています。
複数の SP から、構造が同じローカル一時テーブル
(テーブル名が # から始まるテーブル)
を使用したい為、
CREATE するだけのローカル一時テーブル作成SP、
DROP するだけのローカル一時テーブル削除SPを、
それぞれ作成しました。
次に、ローカル一時テーブルを使用したい SP 内で、
ローカル一時テーブル作成SP を EXECUTE 後、
ローカル一時テーブルに対し、INSERT をしたところで
以下のようなエラーとなります。
※INSERT の変わりに、SELECT にしてみても同様でした。
メッセージ 208、レベル 16、状態 0、プロシージャ TEST_SP、行 155
オブジェクト名 '#LocalWorkTable' が無効です。
※TEST_SP とは、ローカル一時テーブルを使用したい SP の名前
#LocalWorkTable とは、ローカル一時テーブルの名前
グローバル一時テーブル
(テーブル名が ## から始まるテーブル)
に変更すると、正常に動作しましたが、
セッションをまたがって使用させたくないのです。
あと、
ローカル一時テーブル作成SPを使用せずに、
ローカル一時テーブルを使用したい SP 内で、直接 CREATE すれば
正常に動作しましたが、
上記にも書いたように、複数の SP で構造が同じローカル一時テーブル
を使用したいので、できれば、別 SP にしたいと考えております。
ストアドをまたがって、ローカル一時テーブルを使用する事は
できないのでしょうか?
No.2ベストアンサー
- 回答日時:
#1です。
もう一つ代案を書いておきます。質問者さんは、「テーブル作成SPを作って共用する」ということを考えておられるので、ストアドを1つ作る代わりにテンプレート用の実テーブルを1つ作るのも手かと思います。
・一時テーブルのレイアウトのテーブル(TEMPLATETBL)を準備
・一時テーブルを使うストアドでは、作成用のストアドを呼ぶ代わりに以下を実行する
SELECT TOP 0 * INTO #TEMPTBL FROM TEMPLATETBL
効果はたぶん同じです。
(DROPはDROP TABLE #TEMPTBLですが、先に書いた通り無理に実行しなくても基本的に自動でDROPされます)
この回答への補足
ご丁寧な回答、どうもありがとうございます。
構造が同じテーブルを作成する方法を、ずっと探していましたが、
見つけられないでいました。
テストして見たところ、この方法で十分対応できそうです。
後は、この一時テーブルに対し、CLUSTERED INDEX を作成し、
使用したいと思います。
1回目に頂いた回答も、
このような方法があるとは知りませんでした。
これで、ストアド作成の幅が広がりそうです。
どうもありがとうございました。
No.1
- 回答日時:
>ストアド プロシージャで作成されたローカル一時テーブルは、ストアド プロシージャが終了すると自動的に削除されます。
テーブルは、そのテーブルを作成したストアド プロシージャによって実行される任意の入れ子になったストアド プロシージャから参照できます。テーブルは、そのテーブルを作成したストアド プロシージャを呼び出したプロセスから参照することはできません。・・と
http://msdn.microsoft.com/ja-jp/library/ms174979 …
に書かれております。
したがって、ストアド間をまたがって使いたいなら
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- MySQL MySQLのテーブル作成で 自信がありません。 2 2022/08/28 05:35
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- MySQL 【投稿情報用データベース posts】は必要ないと思います。 1 2022/06/02 21:25
- Oracle SQL update方法 2 2022/06/22 14:07
- Access(アクセス) AccessVBAで任意の複数リンクテーブルをAccessVBAを動かす際に削除したいと考えておりま 1 2022/11/17 15:45
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- MySQL [1000地域 × 10カテゴリー = 1万件のテーブル]!グループ化? 1 2023/06/14 23:56
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
遅刻の「言い訳」選手権
よく遅刻してしまうんです…… 「電車が遅延してしまい遅れました」 「歯医者さんが長引いて、、、」 「病院が混んでいて」 などなどみなさんがこれまで使ってきた遅刻の言い訳がたくさんあるのではないでしょうか?
-
いけず言葉しりとり
はんなりと心にダメージを与える「いけず言葉」でしりとりをしましょう。 「あ」あら〜しゃれた服着てはりますな 遠くからでもわかりましたわ
-
好きな和訳タイトルを教えてください
洋書・洋画の素敵な和訳タイトルをたくさん知りたいです!【例】 『Wuthering Heights』→『嵐が丘』
-
ストアドプロシジャからストアドプロシジャを呼ぶには?
Oracle
-
テーブル名が可変の場合のクエリの書き方
MySQL
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
accessテーブル作成クエリを実...
-
Access のリレーションシップで...
-
SI Object Browserのテーブルス...
-
クエリのキャンセルがいつにな...
-
ユニオンクエリの結果をテーブ...
-
コンボボックスで入力したもの...
-
あるテーブルのデータを追加、...
-
ストアドをまたがるローカル一...
-
VIEWしか読み取れないユーザの...
-
AccessでOracleのテーブルをリ...
-
ADOでSeekメッソッドが使えませ...
-
UNIONなどで複数のテーブルから...
-
テーブル作成クエリで新テーブ...
-
レプリケーションしているテー...
-
AccessのテーブルをSQL文に...
-
#ワークテーブルにinsert時 変...
-
SQL文によるシードとインクリメ...
-
SQLサーバーのテーブルの値...
-
位置を指定してフィールドを追...
-
エクセルでテーブルの最終行が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
クエリのキャンセルがいつにな...
-
accessテーブル作成クエリを実...
-
SI Object Browserのテーブルス...
-
エクセルでテーブルの最終行が...
-
ユニオンクエリの結果をテーブ...
-
あるテーブルのデータを追加、...
-
UNIONなどで複数のテーブルから...
-
ストアドをまたがるローカル一...
-
AccessでOracleのテーブルをリ...
-
コンボボックスで入力したもの...
-
SQLスクリプトを自動生成する方法
-
SQLサーバーのテーブルの値...
-
テーブル作成クエリで新テーブ...
-
アクセスのテーブル作成クエリ...
-
重複するレコードに対しフラグ...
-
レプリケーションしているテー...
-
列サイズ変更時、DB停止は必要?
-
VIEWしか読み取れないユーザの...
-
Access のリレーションシップで...
-
位置を指定してフィールドを追...
おすすめ情報