分かる人だけ、回答してください。
ストアドプロシージャST1は、テーブルのデータ(テーブルセット)を返すストアドです。
別のストアドで、一時テーブルの中にこのST1の結果を代入したくて、
select * into #tmpTable
from ST1
と書いても、この箇所が構文エラーになります。
一時テーブルの中にストアドの結果テーブルを代入するにはどうしたらいいのでしょうか?
ヘルプなどを見ましたが、それなりに回りくどいやりかたであればできるようなのです。
しかし、上記を実現するための、できるだけ簡単な方法を教えてください。
納得できる回答を最初にいただいた方に、ポイントをすべて配分したいと思っています。
よろしくお願いします。
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
もし構造が実行時まで不明であれば、おそらく「回りくどいやりかた」にあたる、カーソルをゲットしてからループ処理をする、という解決方法になります
MSDN Home Page
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
関数(ユーザー定義関数のことですよね)ですか・・・
存在は知ってましたが、つかったことはないんです。
関数に関してヘルプを見てましたが・・・ビューでできることは全て関数で実現できる、そしてストアドでできることは全て関数で実現できるって認識でよいのでしょうか?
「インライン ユーザー定義関数」と「table 型を返すユーザー定義関数」は、似て非なるものなのでしょうか? それとも、まったく同等のものなのでしょうか?
既存のストアドを全部関数で書き換え、今後は関数で全て運用していけば、問題はバッチリ解決できるでしょうか?
手元に40近いストアドがあるのですが(これを機能ごとに分割して再書き換えする予定)、書き換えに伴う対費用効果とかも考えないといけません。
このあたりの問題もあるので、関数をつかうなら事前に十分な検討が必要になりそうです。
引き続き、一時テーブルにストアドの出力内容を保存する方法、ならびに関数に関する情報をお待ちします。
回答ありがとうございます。
実はこのやりかたはヘルプで見たのですが、コレ自体が回りくどいやりかたなんです。
↑ 私はそう考えてます。先に書いておくべきでしたね。
というのも、このやりかただと、ストアドの出力テーブルの仕様が変われば、そのストアドを呼び出す前に定義する一時テーブル(上記の例だと#hoge)の定義も全て書き直さなければなりません。
メンテナンスの面で、やっかいな問題を抱えています。
<ちょっと背景を述べますと>
一般のプログラミングにおいて、一つのおおきな処理を、機能ごとに複数のメソッドに分けて処理させたりしますよね。コードの読みやすさや、メンテナンスの容易さを重視したり、メソッドを各所で再利用したい時に取られる方法の一種です。
これと同じように、ある大きな処理をするストアドを1個書くのではなくて、機能ごとに複数のストアドに分割して実行させたいのです。
このとき、上記の問題にぶちあたったのです。