ストアドの一時テーブル格納について

このQ&Aのポイント
  • SQLServer2000を使用しています。sp_help_jobの結果セットを一時テーブルにいれたく、以下のようなスクリプトを作成しています。
  • スクリプトを実行すると、以下のエラーでInsertに失敗します。メッセージ 8164、レベル 16、状態 1、プロシージャ sp_get_composite_job_info、行 72 INSERT EXEC ステートメントは入れ子にはできません。
  • 上記の改善策についてアドバイス頂けないでしょうか。よろしくお願いします。
回答を見る
  • ベストアンサー

ストアドの一時テーブル格納について

ストアドの一時テーブル格納について SQLServer2000を使用しています。 sp_help_jobの結果セットを一時テーブルにいれたく、 以下のようなスクリプトを作成しています。 -------------- create table #tbl (  列名  ・  ・  ・ ) Insert into #tbl msdb.dbo.sp_help_job -------------- スクリプトを実行すると、以下のエラーでInsertに失敗します。 「メッセージ 8164、レベル 16、状態 1、プロシージャ sp_get_composite_job_info、行 72 INSERT EXEC ステートメントは入れ子にはできません。」 上記の改善策についてアドバイス頂けないでしょうか。 よろしくお願いします。

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

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

sp_help_job内でコールされている「sp_get_composite_job_info」が「INSERT EXEC文」を使用しているため、このエラーが表示されます。 したがって、 ・エラーは出ても、トラップしなければ、結果は受け取れているのではないですか?  それならば割り切ってそのまま使うのも手です。 ・お勧めはしませんが、sp_helptextを使えばソースを見られますから、sp_get_composite_job_infoのソースを元にオリジナルのストアドを作成して、その処理の中でワークテーブルにセットしてしまうということもできなくはないです。  (条件指定をしないなら、基本的にはsp_help_jobとsp_get_composite_job_infoの実行結果は同じはずです)  もちろん、システムストアドプロシージャはバージョンやサービスパックなどにより、予告なしに変更されることがありますので、そのリスクはとらなくてはなりません。

aimizuch
質問者

お礼

お返事遅くなり申し訳ございません。 やはり一筋縄ではいかないようですね。 ご回答ありがとうございました。

関連するQ&A

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

    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 にしたいと考えております。 ストアドをまたがって、ローカル一時テーブルを使用する事は できないのでしょうか?

  • T-SQLで一時テーブルの名前を毎回変更できるストアドを作りたい

    お世話になります。 初歩的な質問で恐縮ですがご教示いただければ幸いです。 T-SQLでグローバル一時テーブルの名前を毎回変更できるストアドを作り、Access2003アプリから実行させる予定です。 ストアドに、CREATE TABLE [dbo].[@tablename]のように書き、 ストアド実行時に@tablenameの値を ##ABC のように入力したのですが、テーブルはtempdbではなく、しかもテーブル名は@tablenameでテーブルが作成されてしまいます。 CREATE TABLE [dbo].@tablename のように[]をとると ストアド自体を作成できずエラーになってしまいます。 宜しくお願いします。 create PROCEDURE [dbo].[ストアドプロシージャー名] (@tablename nvarchar(255)) AS BEGIN from SET NOCOUNT ON; CREATE TABLE [dbo].[@tablename] <以下省略>

  • ストアドプロシージャの多用でパフォーマンスは向上するか?

    抽象的な話で非常に恐縮なのですが、 ストアドの中で行うSELECTやINSERTなどの処理を 更にストアドにすることで、パフォーマンスは向上するのでしょうか? たとえば、「テーブルAの内容を取得してテーブルBにINSERT」というストアドがあったとします。 この場合、以下のような記述になると思います。 ---------------------------------- SELECT (略) FROM TBL_A INSERT INTO TBL_B (略) ---------------------------------- このSELECT及びINSERT処理をそれぞれストアド化し、 ---------------------------------- EXEC SP_A (略) EXEC SP_B (略) ---------------------------------- とすると、わずかなりでも処理速度は向上するのでしょうか? (極論ですが、全てのSELECT、INSERT、UPDATEをストアド化するのがベストなのでしょうか?) 現在、数百万~数千万件のレコードを処理するストアドを作成中で、処理時間の短縮が大きな課題になっています。 1件あたりの処理が0.1秒でも縮めば、10万件の処理時間は10,000秒(=3時間弱)の短縮になり、決して馬鹿にはできません。 妙な質問ですが、良策があればご教授ください。

  • ストアドにしたらエラーになる

    10gを使ってます。 1.ワークテーブル作成 2.そのテーブルにインサート の一連のスクリプトをsql/plusかなんかでやると問題ないのに それをストアドにしたら2.の時にテーブルが存在しないと言うことで コンパイルエラーになってしまいます。 こうゆう場合どうすればコンパイルエラーを回避できるのでしょうか? 1.と2.を分割して二つのストアドにしないといけないのでしょうか。

  • SQLserver2005 テーブル一覧の取得

    SQLserver2005 テーブル一覧の取得 知っている方には、基礎すぎて申し訳ないのですが、 添付画像のテーブルを選択して、SQLペインを表示させて そこに、  EXEC sp_tables と記述して、テーブル一覧を取得しようとして「!」マークを 押して、sp_tablesを実行させようとした所、下記のようなエラーメッセージが 出てしまいます。 EXEC SQL コンストラクトまたはステートメントはサポートされていません。 書き方が悪いのか、ストアドプロシージャの実行場所が悪いのかよく分かりませんが うまく行きません。 sp_tablesを使用して、テーブル一覧を取得する方法をどなたか教えて下さい。 よろしくお願いします。

  • SQLServer200 ストアドでデータベースのバックアップ

    SQLServer200のストアドでデータベースのバックアップを取りたいのですがやり方が分かりません。 BACKUP DATABASE [@Database_Name] TO [@Device_Name] のような感じでやるようなのですが(別の方法もあるようです)詳細がわかりません、教えていただけないでしょうか? 「msdb.dbo.sp_add_job」を使ってるのも見かけたのですが、これもわかりません。お願いいたしますm(__)m

  • テーブルの項目名を変数にするには?

    <開発環境> WindowsXP Professional SQL Server 2005 いつもお世話になっております。 次のようなことをやりたいのですが、上手くできず困っています。 どなたかご教示くださると助かります。 ○やりたいこと  テーブルの項目数が1~200個あり、項目名が「ユーザ数001」「アクセス回数001」~ 「ユーザ数100」「アクセス回数100」の順に並んでいる。 そこで、変数を使って「ユーザ数001」~「ユーザ数100」と 「アクセス回数001」~「アクセス回数100」にSELECTして得られた 結果をINSERTしたい。 テーブルの列名(項目名)は以下のようにして取得することはできました。 SELECT dbo.syscolumns.name FROM dbo.syscolumns INNER JOIN dbo.sysobjects ON (dbo.sysobjects.id = dbo.syscolumns.id) WHERE dbo.sysobjects.name = 'テーブル名' AND (dbo.syscolumns.name LIKE '%ユーザ数%' + @cnt OR dbo.syscolumns.name LIKE '%アクセス回数%' + @cnt) @cntは変数で1~100までカウントアップして列名を取得しています。 ○困っていること ・上記のSELECTで得られた結果を別の変数「@User」「@Access」にセットしたいが上手くできない。 ・さらに「@User」「@Access」を使って、INSERTを行いたい。 (具体的には以下のようにしたい) INSERT INTO dbo.[テーブル名](@User,@Access) SELECT TOP 100 UCNT, ACNT FROM ( SELECT・・・ (このINSERT文は前後にWHILE文で1~100まで処理を回して、変数「@cnt」がカウントアップするようにしています) 以上、下手な説明でわかりにくいかもしれませんが、宜しくお願い致します。

  • [PostgreSQL]別DBのテーブルのSelect、Insert

    お世話になっております PostgreSQL8.1を使用しまして あるテーブルにInsertがかかると その内容を判断し別のテーブルに insertをする仕組みが必要になり いろいろ試してみて TriggerとFunctionを使用すれば 実装できるとこまでわかりました。 ただしその別テーブルが別DBに配置されているので そのテーブルに以下のようなInsert文を発行しても エラーになってしまいます。 Insert into SUB_DB.TEST_TBL values('test','date'・・・・); (SUB_DB:ストアドを実行しているのとは別のDB) ストアドから別テーブルを参照更新する手段を ご存知のかたご教授いただけますでしょうか。 よろしくお願いいたします。

  • トリガからストアド実行について

    あるテーブルに追加処理を行った場合、ストアドを実行を実行したく、 トリガを作成してみましたが、 『トランザクションはトリガーで終了しました。バッチは中止されました。』という エラーが出てしまい困っています。 エラー内容で検索してもあまり出てこないので、 初歩的且つ、根本的に間違っているかと思うのですが、 初めて作成した為、なにがいけないのかも検討がつかない為、 ご教示頂きたく、投稿させて頂きます。 ○トリガ ALTER TRIGGER [dbo].[TRIG_SEND_MAIL] ON [dbo].[SEND_MAIL_INFO] FOR INSERT AS begin EXEC dbo.mail_test end ○目的としては対象テーブルを実行するとトリガを発動し、【dbo.mail_test】を起動させたい insert into SEND_MAIL_INFO (PROFILE_NAME,SEND_FLG) values ('AAAAAA','0') 上記SQL文を実施するとエラーなってしまいますので どうすればよいのか具体的な対処方法をご教示頂きたく、 何卒宜しくお願い申し上げます。

  • ストアド内でカラム名一覧を取得

    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ストアド内でカラム名一覧を取得、カンマで繋げてひとつの変数にまとめたい。 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 現在開発でストアドを使用する機会があり、そこで不明点が発生し悩んでおります。 以下、現状と質問です。 ■SQL SERVER 2000 ■テーブル(※)のカラム名一覧を取得し、  カラム名をカンマで繋げてひとつの変数に格納したいと思っています。  ※先の処理でカラムを取得したいテーブルをSELECTしており、  対象のテーブル名を変数に代入しています。  カラム一覧を取得するにあたり、以下のようにカーソルで習得し、  FETCHでカラム名を変数に格納しようと考えていましたが、  「'対象テーブル名'」には変数がいれられないので、どうしようかと悩んでいます。  DECLARE CURS_test CURSOR FOR   SELECT name FROM dbo.syscolumns   WHERE id IN   (SELECT id FROM dbo.sysobjects WHERE name = '対象テーブル名')   ORDER BY id, colid;  「sp_executesql」を使用してselect文を流そうとしたのですが、  複数ある列名を取得して、上記で記載しましたように  カラム名をカンマで繋げてひとつの変数に格納する方法がわかりませんでした。  こういった場合、どのように考えて、どのように書けばよいのでしょうか。  まだ触り始めたばかりで、わからないことがわかっていない部分もあり、  質問内容でわかりにくい部分がありましたらご指摘いただければと思います。  どうぞよろしくお願いいたします。