関数としてのストアド プロシージャの書き直し

このトピックでは、既存のストアド プロシージャのロジックをユーザー定義関数として書き直すかどうかを判断する方法について説明します。たとえば、ストアド プロシージャをクエリから直接呼び出す場合は、そのコードをユーザー定義関数として再パッケージ化します。

一般に、ストアド プロシージャから 1 つの結果セットが返される場合は、テーブル値関数を定義します。ストアド プロシージャでスカラ値が計算される場合は、スカラ関数を定義します。

テーブル値関数の条件

ストアド プロシージャが次の条件を満たしている場合は、テーブル値関数として書き直しの対象となります。

  • ロジックを 1 つの SELECT ステートメントで表現できるが、パラメータが必要であるために、ビューではなくストアド プロシージャになっているもの。このシナリオは、インライン テーブル値関数で処理できます。

  • 更新操作を実行しないストアド プロシージャである (テーブル変数への更新を除く)。

  • 動的 EXECUTE ステートメントが不要である。

  • 1 つの結果セットを返すストアド プロシージャである。

  • 一時テーブルに読み込む中間結果を作成することを主な目的とするストアド プロシージャである。この一時テーブルに対して、後から SELECT ステートメント内でクエリを実行します。INSERT...EXEC ステートメントはテーブル値関数を使用して記述できます。たとえば、次のシーケンスを考えてみます。

    INSERT #temp EXEC sp_getresults
    SELECT ...
    FROM #temp, t1
    WHERE ...
    

    sp_getresults ストアド プロシージャは、テーブル値関数 (たとえば、fn_results()) として書き直すことができます。つまり、上記のステートメントは次のように書き直すことができます。

    INSERT #temp
    SELECT ...
    FROM fn_results(), t1
    WHERE ...
    

CLR を使用した拡張ストアド プロシージャの書き直し

CLR 関数には、拡張ストアド プロシージャに代わるより信頼性および拡張性の高い機能が用意されています。多くの拡張ストアド プロシージャにより、Transact-SQL では記述することが難しい一部の計算タスクが実行されます。上記の利点から、このようなストアド プロシージャは CLR を使用して書き直すことができます。さらに、ファイルや Web サービスなどの外部リソースにアクセスして結果セットを返す拡張ストアド プロシージャは、CLR テーブル値関数を使用して書き直すことができます。詳細については、「CLR 関数の作成」を参照してください。