

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も見ています
-
ストアドプロシジャからストアドプロシジャを呼ぶには?
Oracle
-
列番号による項目の取得について
SQL Server
-
列名XXXXが無効です
SQL Server
-
-
4
引数によってwhere句を切り替える方法
Oracle
-
5
列名に変数を使うことはできないのでしょうか?
SQL Server
-
6
【Transact-sql】 execの結果をoutputパラメータに持たせたい
SQL Server
-
7
SPREAD(GrapeCity)のセルにフォーカスを設定するにはどうしたらいいのでしょうか?
Visual Basic(VBA)
-
8
テーブル列数とデータファイル列数の違うbcpインサートをしたい
SQL Server
-
9
SQLServer2005のストアドプロシージャで変数を配列で使用する方法をご教示ください
SQL Server
-
10
CloseとDisposeの違い
Visual Basic(VBA)
-
11
group byの並び順を変えるだけで結果が異なる
Oracle
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SI Object Browserのテーブルス...
-
クエリのキャンセルがいつにな...
-
ユニオンクエリの結果をテーブ...
-
アクセスのテーブル作成クエリ...
-
あるテーブルのデータを追加、...
-
accessテーブル作成クエリを実...
-
ストアドをまたがるローカル一...
-
#ワークテーブルにinsert時 変...
-
VIEWしか読み取れないユーザの...
-
Access のリレーションシップで...
-
PL/SQLでFROM句に変数を使いたい
-
エクセルでテーブルの最終行が...
-
UNIONなどで複数のテーブルから...
-
「マスタ」と「テーブル」の違...
-
ACCESS2007 フォーム 「バリア...
-
Access VBA [リモートサーバー...
-
3つ以上のテーブルをUNIONする...
-
Accessにインポートしたら並び...
-
ACCESSのSQLで、NULLかNULLでな...
-
SELECT時の行ロックの必要性に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SI Object Browserのテーブルス...
-
クエリのキャンセルがいつにな...
-
accessテーブル作成クエリを実...
-
ユニオンクエリの結果をテーブ...
-
あるテーブルのデータを追加、...
-
エクセルでテーブルの最終行が...
-
UNIONなどで複数のテーブルから...
-
SQLサーバーのテーブルの値...
-
列サイズ変更時、DB停止は必要?
-
コンボボックスで入力したもの...
-
ストアドをまたがるローカル一...
-
レプリケーションしているテー...
-
VIEWしか読み取れないユーザの...
-
ACCESS-リンクテーブルの設定で...
-
ADOでSeekメッソッドが使えませ...
-
重複するレコードに対しフラグ...
-
AccessVBAで降順にするテーブル...
-
アクセスのテーブル作成クエリ...
-
Accessでバージョン違いのファ...
-
AccessでOracleのテーブルをリ...
おすすめ情報