本質的には違いはありません。ただ、この関数には変数を 1 つしか返せないという制限があります。ストアド プロシージャは複数を返すことができます。関数は SQL に埋め込むことができ、select で呼び出すことができますが、ストアド プロシージャは埋め込むことができません。実行の本質は同じです。
一時テーブルが使えない、テーブル変数しか使えないなど、関数には多くの制限がありますが、ストアドプロシージャの制限は比較的少ないです
1.ストアド プロシージャの実装 この関数はもう少し複雑で、関数の実装はより対象を絞っています。
2. ストアドプロシージャはパラメータを返すことができますが、関数は値またはテーブルオブジェクトのみを返すことができます。
3. ストアド プロシージャは通常、独立した部分として実行されますが、関数はクエリ ステートメントの一部として呼び出すことができるため、関数はテーブル オブジェクトを返すことができるため、クエリ ステートメントの FROM キーワードの後に配置できます。
4. ストアド プロシージャと関数が実行されると、SQL マネージャーはプロシージャ キャッシュに移動して、対応するクエリ ステートメントを取得します。プロシージャ キャッシュに対応するクエリ ステートメントがない場合、SQL マネージャーはストアド プロシージャと関数をコンパイルします。
プロシージャキャッシュに保存されるのは実行プランであり、コンパイル後はプロシージャキャッシュ内の実行プランが実行され、その後SQL SERVERがそれぞれの実情に応じてこのプランをキャッシュに保存するかどうかを検討します。実行計画。最初の評価基準は、この実行計画が使用される頻度です。2 番目の基準は、この計画を生成するコスト、つまりコンパイルにかかる時間です。キャッシュに保存されたプランは、次回実行時にコンパイルする必要はありません。
ストアド プロシージャとユーザー定義関数の具体的な違い
まず定義を見てみましょう:
ストアド プロシージャ
ストアド プロシージャを使用すると、データベースの管理と、データベースとそのユーザーに関する情報の表示がはるかに簡単になります。ストアド プロシージャは、SQL ステートメントとオプションの制御フロー ステートメントのプリコンパイルされたコレクションで、名前を付けて保存され、1 つの単位として処理されます。ストアド プロシージャはデータベースに保存され、呼び出しを通じてアプリケーションで実行でき、ユーザーは変数、条件付き実行、その他の強力なプログラミング機能を宣言できます。
ストアドプロシージャには、プログラムフロー、ロジック、データベースへのクエリを含めることができます。パラメータ、出力パラメータを受け入れ、単一または複数の結果セットを返し、値を返すことができます。
ストアドプロシージャは SQL ステートメントを使用するあらゆる目的に使用でき、次の利点があります:
一連の SQL ステートメントを単一のストアド プロシージャで実行できます。
独自のストアド プロシージャ内から他のストアド プロシージャを参照できるため、一連の複雑なステートメントを簡素化できます。
ストアドプロシージャは作成時にサーバー上でコンパイルされるため、単一の SQL ステートメントよりも高速に実行されます。
ユーザー定義関数
関数は、再利用のためにコードをカプセル化するために使用できる 1 つ以上の Transact-SQL ステートメントで構成されるサブルーチンです。 Microsoft® SQL Server® 2000 は、ユーザーを Transact-SQL 言語の一部として定義された組み込み関数に制限せず、代わりにユーザーが独自のユーザー定義関数を作成できるようにします。
ユーザー定義関数は、CREATE FUNCTION ステートメントを使用して作成し、ALTER FUNCTION ステートメントを使用して変更し、DROP FUNCTION ステートメントを使用して削除できます。完全に正当なユーザー定義関数名 (database_name.owner_name.function_name) はそれぞれ一意である必要があります。
ユーザー定義関数を作成、変更、または削除するには、CREATE FUNCTION 権限が付与されている必要があります。所有者ではないユーザーが Transact-SQL ステートメントで関数を使用できるようにするには、その関数に対する適切なアクセス許可をユーザーに付与する必要があります。 CHECK 制約、DEFAULT 句、または計算列定義でユーザー定義関数を参照するテーブルを作成または変更するには、その関数に対する REFERENCES 権限も必要です。