誰でも、ストアドプロシージャとユーザー定義関数の正確な違いは何か、どのコンテキストでそれぞれが役立つかを説明できますか?
これは私が常に心がけていることです:)
ソース http://www.codeproject.com/Tips/286539/Difference-between-stored-procedure-and-function
関数は常に値を返し、not DMLステートメント(INSERT/UPDATE/DELETE)を実行できます。
ストアドプロシージャは値を返すことができません(OUTパラメーターを使用する必要があります)。また、DMLステートメントを実行できます。
上記の比較は別として、それらは等しいです。しかし、比較を考えると、何をする必要があるかに応じて、関数よりもストアドプロシージャをより頻繁に使用する可能性があります。
ユーザー定義関数には、DMLステートメントを使用できるなどの制限がほとんどありません。plsチェック
違い:
プロシージャーは、入力(デフォルト)、出力、および入出力タイプのパラメーターを受け入れることができます。関数は入力タイプのパラメーターのみを受け入れることができます。
プロシージャは、値を返す場合と返さない場合があります。また、OUTPUTおよび/またはINOUTパラメータを使用して複数の値を返す場合もあります。プロシージャは、OUTPUTおよび/またはINOUTパラメータを介して最大1024の値を返す場合があります。関数は常に1つの値のみを返します。
ストアドプロシージャは、デフォルトでゼロで常に整数値を返します。関数の戻り値のタイプは、スカラー値またはテーブル値またはテーブル値です。
ストアドプロシージャはテーブルを作成できますが、テーブルを返すことはできません。関数は、テーブル変数を作成、更新、削除できます。テーブルを返すことができます
ストアドプロシージャは、挿入、削除、更新、および作成操作を使用して、データベースの状態に影響を与える可能性があります。関数はデータベースの状態に影響を与えることはできません。つまり、データベースに対して挿入、削除、更新、および作成の操作を実行することはできません。
ストアドプロシージャは、コンパイルされた形式でデータベースに格納されます。関数は実行時にのみ解析およびコンパイルされます。
ストアドプロシージャは、execキーワードを使用して個別に呼び出すことができます。ストアドプロシージャは、select/where/having句では使用できません。関数はselect/where/having句から呼び出されます。 2つの関数を結合することもできます。
通常、ストアドプロシージャは特定のタスクを実行するために使用されます。関数は値の計算に使用されます。ストアドプロシージャを使用すると、getdate()またはその他の非決定的関数を許可できます。関数はgetdate()のような非決定的な関数を許可しません。
ストアドプロシージャでは、トランザクションステートメントを使用できます。関数では使用できません。
ストアドプロシージャは、新しいレコードの挿入、レコードの更新、既存のレコードの削除など、すべてのDML操作を実行できます。この関数では、ストアドプロシージャのようにデータベーステーブルでDML操作を実行できません。 select操作のみを実行できます。既存のテーブルでDMLを実行することはできません。ただし、ユーザー定義関数内のテーブル変数でのみDML操作を実行できます。
一時テーブル(派生)は、ストアドプロシージャで作成できます。関数の場合は不可能です。
SQLステートメントでエラーが発生すると、T-SQLはSPROCのエラーを無視し、残りのコードの次のステートメントに進みます。関数の場合、T-SQLは次のステートメントの実行を停止します。
このリンクを参照してください: