web-dev-qa-db-ja.com

ストアドプロシージャとユーザー定義関数の違い

誰でも、ストアドプロシージャとユーザー定義関数の正確な違いは何か、どのコンテキストでそれぞれが役立つかを説明できますか?

43
vasu

これは私が常に心がけていることです:)

  • プロシージャはゼロまたはn値を返すことができますが、関数は1つの値を返すことができますが、これは必須です。
  • プロシージャには入力/出力パラメータを設定できますが、関数には入力パラメータのみを設定できます。
  • プロシージャではselectおよびDMLステートメントを使用できますが、関数ではselectステートメントのみを使用できます。
  • 関数はプロシージャから呼び出すことができますが、プロシージャは関数から呼び出すことはできません。
  • Try-catchブロックは関数では使用できませんが、例外はプロシージャ内のtry-catchブロックで処理できます。
  • トランザクション管理を手続きで行うことができますが、機能することはできません。
  • プロシージャはselect文で使用できませんが、関数はselect文に埋め込むことができます。
  • UDFは、ストアドプロシージャとして使用できないWHERE/HAVING/SELECTセクションの任意の場所でSQLステートメントで使用できます。
  • テーブルを返すUDFは、別の行セットとして扱うことができます。これは、他のテーブルとのJOINで使用できます。
  • インラインUDFは、パラメーターを取得し、JOINやその他の行セット操作で使用できるビューとして使用できます。

ソース http://www.codeproject.com/Tips/286539/Difference-between-stored-procedure-and-function

46
Singleton

関数は常に値を返し、not DMLステートメント(INSERT/UPDATE/DELETE)を実行できます。

ストアドプロシージャは値を返すことができません(OUTパラメーターを使用する必要があります)。また、DMLステートメントを実行できます。

関数とストアドプロシージャを使用する利点


上記の比較は別として、それらは等しいです。しかし、比較を考えると、何をする必要があるかに応じて、関数よりもストアドプロシージャをより頻繁に使用する可能性があります。

14
OMG Ponies

ユーザー定義関数には、DMLステートメントを使用できるなどの制限がほとんどありません。plsチェック

5
gkpstar

違い

  1. プロシージャーは、入力(デフォルト)、出力、および入出力タイプのパラメーターを受け入れることができます。関数は入力タイプのパラメーターのみを受け入れることができます。

  2. プロシージャは、値を返す場合と返さない場合があります。また、OUTPUTおよび/またはINOUTパラメータを使用して複数の値を返す場合もあります。プロシージャは、OUTPUTおよび/またはINOUTパラメータを介して最大1024の値を返す場合があります。関数は常に1つの値のみを返します。

  3. ストアドプロシージャは、デフォルトでゼロで常に整数値を返します。関数の戻り値のタイプは、スカラー値またはテーブル値またはテーブル値です。

  4. ストアドプロシージャはテーブルを作成できますが、テーブルを返すことはできません。関数は、テーブル変数を作成、更新、削除できます。テーブルを返すことができます

  5. ストアドプロシージャは、挿入、削除、更新、および作成操作を使用して、データベースの状態に影響を与える可能性があります。関数はデータベースの状態に影響を与えることはできません。つまり、データベースに対して挿入、削除、更新、および作成の操作を実行することはできません。

  6. ストアドプロシージャは、コンパイルされた形式でデータベースに格納されます。関数は実行時にのみ解析およびコンパイルされます。

  7. ストアドプロシージャは、execキーワードを使用して個別に呼び出すことができます。ストアドプロシージャは、select/where/having句では使用できません。関数はselect/where/having句から呼び出されます。 2つの関数を結合することもできます。

  8. 通常、ストアドプロシージャは特定のタスクを実行するために使用されます。関数は値の計算に使用されます。ストアドプロシージャを使用すると、getdate()またはその他の非決定的関数を許可できます。関数はgetdate()のような非決定的な関数を許可しません。

  9. ストアドプロシージャでは、トランザクションステートメントを使用できます。関数では使用できません。

  10. ストアドプロシージャは、新しいレコードの挿入、レコードの更新、既存のレコードの削除など、すべてのDML操作を実行できます。この関数では、ストアドプロシージャのようにデータベーステーブルでDML操作を実行できません。 select操作のみを実行できます。既存のテーブルでDMLを実行することはできません。ただし、ユーザー定義関数内のテーブル変数でのみDML操作を実行できます。

  11. 一時テーブル(派生)は、ストアドプロシージャで作成できます。関数の場合は不可能です。

  12. SQLステートメントでエラーが発生すると、T-SQLはSPROCのエラーを無視し、残りのコードの次のステートメントに進みます。関数の場合、T-SQLは次のステートメントの実行を停止します。

このリンクを参照してください:

https://www.spritle.com/blogs/2011/03/03/differences-between-stored-procedures-and-user-defined-functions/

0
Vinayak Savale