SQLServer2000のストアドに関連して質問です。

分かる人だけ、回答してください。


ストアドプロシージャST1は、テーブルのデータ(テーブルセット)を返すストアドです。

別のストアドで、一時テーブルの中にこのST1の結果を代入したくて、
  select * into #tmpTable
  from ST1
と書いても、この箇所が構文エラーになります。

一時テーブルの中にストアドの結果テーブルを代入するにはどうしたらいいのでしょうか?


ヘルプなどを見ましたが、それなりに回りくどいやりかたであればできるようなのです。
しかし、上記を実現するための、できるだけ簡単な方法を教えてください。

納得できる回答を最初にいただいた方に、ポイントをすべて配分したいと思っています。
よろしくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:akibare No.1

回答回数157ベストアンサー獲得回数5

ポイント25pt

http://dbforums.com/t436979.html

Use Execute subquery in Select of Stored Procedure? - dBforums

ST1の結果のテーブル構造がわかっている場合は割と簡単です。そのテーブル構造と同じ一時テーブルを定義してからINSERTをすればよいのです。


例)


create procedure spz_hoge as

select type from syscharsets

go


create table #hoge

(

type smallint not null

)

go


INSERT #hoge EXEC spz_hoge

go


select * from #hoge

もし構造が実行時まで不明であれば、おそらく「回りくどいやりかた」にあたる、カーソルをゲットしてからループ処理をする、という解決方法になります

id:auction

回答ありがとうございます。

実はこのやりかたはヘルプで見たのですが、コレ自体が回りくどいやりかたなんです。

↑ 私はそう考えてます。先に書いておくべきでしたね。

というのも、このやりかただと、ストアドの出力テーブルの仕様が変われば、そのストアドを呼び出す前に定義する一時テーブル(上記の例だと#hoge)の定義も全て書き直さなければなりません。

メンテナンスの面で、やっかいな問題を抱えています。

<ちょっと背景を述べますと>

一般のプログラミングにおいて、一つのおおきな処理を、機能ごとに複数のメソッドに分けて処理させたりしますよね。コードの読みやすさや、メンテナンスの容易さを重視したり、メソッドを各所で再利用したい時に取られる方法の一種です。

これと同じように、ある大きな処理をするストアドを1個書くのではなくて、機能ごとに複数のストアドに分割して実行させたいのです。

このとき、上記の問題にぶちあたったのです。

2005/07/18 17:06:53
id:akibare No.2

回答回数157ベストアンサー獲得回数5

ポイント25pt

2回目の回答で失礼。TSQLで内部で機能を分割する場合はprocedureではなくてfunctionとかviewを使います。単純なselect文であればviewを、複雑な処理はfunctionで。


例)


create function fn_hoge ()

returns table

as

return (

select type from syscharsets

)

go


select * into #hoge from fn_hoge()

go


select * from #hoge

go

id:auction

関数(ユーザー定義関数のことですよね)ですか・・・

存在は知ってましたが、つかったことはないんです。

関数に関してヘルプを見てましたが・・・ビューでできることは全て関数で実現できる、そしてストアドでできることは全て関数で実現できるって認識でよいのでしょうか?

「インライン ユーザー定義関数」と「table 型を返すユーザー定義関数」は、似て非なるものなのでしょうか? それとも、まったく同等のものなのでしょうか?

既存のストアドを全部関数で書き換え、今後は関数で全て運用していけば、問題はバッチリ解決できるでしょうか?

手元に40近いストアドがあるのですが(これを機能ごとに分割して再書き換えする予定)、書き換えに伴う対費用効果とかも考えないといけません。

このあたりの問題もあるので、関数をつかうなら事前に十分な検討が必要になりそうです。

引き続き、一時テーブルにストアドの出力内容を保存する方法、ならびに関数に関する情報をお待ちします。

2005/07/18 19:15:45

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません