- PR -

関数の引数にストアドプロシージャを指定する

1
投稿者投稿内容
いつはし
会議室デビュー日: 2006/10/30
投稿数: 12
投稿日時: 2009-04-15 12:19
SQL Server2005を使用しています。
関数の引数にストアドプロシージャを指定する方法はあるのでしょうか?

たとえば、以下のような方法です。(実行すると「不適切な構文」エラーになります)
select count(*) from (ストアドプロシージャ名) as tmp

目的としては、ストアドプロシージャを作成し、
それを単に実行する場合と、実行時の行数を取得する場合の2パターンの
処理を行いたいと思っています。

ストアドプロシージャ内にカウント関数を持ち、カウントするかしないかをIF文で記述して分ける方法も考えたのですが、既にある処理が冗長なので、できればこれ以上複雑にしたくないと思っています。
また、戻り値から行数を取得する方法では、selectの実行結果も合わせて返ってくるため、ネットワークが重くなるかと思っています。

よろしくお願いします。
turutosiya
常連さん
会議室デビュー日: 2003/06/10
投稿数: 49
お住まい・勤務地: 東京都
投稿日時: 2009-04-15 13:04
「テーブル値関数」がベストかと思います。

○ 件数を取る場合
SELECT COUNT(*) FROM hogehogefnc()

○ データを取る場合
SELECT * FROM hogehogefnc()

こんな感じで書けます


詳しくはMSDNを
http://msdn.microsoft.com/ja-jp/library/ms191165.aspx




_________________
Toshiya Tsuru
http://d.hatena.ne.jp/turutosiya/
いつはし
会議室デビュー日: 2006/10/30
投稿数: 12
投稿日時: 2009-04-15 15:02
>turutosiyaさん
ありがとうございます。
確かに、非常に有用な手段のようですね。
ただ、調べたところテーブル値関数にはデータ量の制限があるらしく、これがネックになる可能性もあるかもしれないと思いました。
また、既に作成済みの多くのストアドプロシージャをなるべく変更したくないので、あくまでストアドプロシージャを使うことを考えたいと思っています。

となると、やはり、ストアドプロシージャ内でカウント関数をもたせるしかないのかもしれませんね…。

もし他に方法があるようでしたら、引き続きご教授いただきたいと思います。
turutosiya
常連さん
会議室デビュー日: 2003/06/10
投稿数: 49
お住まい・勤務地: 東京都
投稿日時: 2009-04-16 14:07
つれづれなるままに考えて、思い浮かんだ案を一つ。

1. ストアドにパラメータ(@CountOnly)を追加
2. 既存のストアドでSELECTしているデータを一時テーブルに入れるように変更(INTO 句を追加)
3. @CountOnlyにより、件数を返すか、データを返すかを切りかえる

というのではどうでしょう?

コード:

SELECT
...
INTO
#Temp
FROM
...
WHERE
...


IF ISNULL(@CountOnly,0) != 0
BEGIN
SELECT
COUNT(*)
FROM
#Temp
END
ELSE
BEGIN
SELECT
*
FROM
#Temp
END

DROP TABLE #Temp

RETURN




引用:
調べたところテーブル値関数にはデータ量の制限があるらしく


これは知りませんでした。差し支えなければソースを教えて頂けませんか?

_________________
Toshiya Tsuru
http://d.hatena.ne.jp/turutosiya/



[ メッセージ編集済み 編集者: turutosiya 編集日時 2009-04-16 14:18 ]
いつはし
会議室デビュー日: 2006/10/30
投稿数: 12
投稿日時: 2009-04-17 22:47
>turutosiya

ありがとうございます!
すでに実装を始めていたのですが、それよりも見た目もすっきりしてますし、
SELECT文を複数に分けている分、スピードも上がりそうです。


>これは知りませんでした。差し支えなければソースを教えて頂けませんか?

前提知識が欠けているため、間違った解釈をしていたら申し訳ありませんが…
以下になります。

http://japan.internet.com/column/developer/20061025/27.html
1

スキルアップ/キャリアアップ(JOB@IT)