SQL Server で関数とストアド プロシージャを作成する

王林
リリース: 2023-09-16 15:13:02
転載
633 人が閲覧しました

在 SQL Server 中编写函数和存储过程

ストアド プロシージャと関数、特定のタスクを実行するために使用されるデータベース オブジェクトに含まれる SQL ステートメントのコレクション (またはデータ サイエンスでも使用できます)。この 2 つは多くの点で異なります。

この記事では、関数と手順、およびそれらの違いについて詳しく説明します。

ストアド プロシージャから始めましょう -

SQL のストアド プロシージャ

単純に記述された SQL コードは、何度も再利用できるように保存され、ストアド プロシージャを形成します。頻繁に作成するクエリを思いついた場合は、それをストアド プロシージャとして保存し、そのストアド プロシージャを呼び出して、ストアド プロシージャの一部として保存した SQL コードを実行できます。これにより、同じ質問を何度も書く必要がなくなります。

同じ SQL コードを繰り返し実行して、ストアド プロシージャにパラメータを指定できます。必要に応じて、ストアド プロシージャは、指定されたパラメーター値に基づいて適切に応答します。

パフォーマンスはストアド プロシージャによって強化することもできます。一連の SQL ステートメントは、複数のタスクを実行するために使用されます。次にどの SQL ステートメントが実行されるかは、最初の SQL ステートメントと条件付きロジックの結果によって異なります。これらの SQL ステートメントとそれに含まれる条件ロジックは、ストアド プロシージャに書き込むことで、サーバー上で 1 つの実行プランに結合できます。すべての作業はサーバー上で実行されるため、結果をクライアントに渡さずに条件付きロジックを実行できます。

ストアド プロシージャの利点

コンパイルと実行

各ストアド プロシージャは SQL Server によって一度コンパイルされ、実行プランが再利用されます。ストアド プロシージャを頻繁に呼び出すと、パフォーマンスが大幅に向上します。

クライアント/サーバーのトラフィック削減

環境内でネットワーク帯域幅が問題になる場合は、ストアド プロシージャを使用すると、長い SQL 検索を 1 行に圧縮して、ネットワーク経由で送信できることを知っておいてください。

コードの効率的な再利用とプログラミングの抽象化

ストアド プロシージャは、多くのユーザー アプリケーションおよびクライアント アプリケーションで使用できます。計画的に使用すると、開発サイクルを完了するまでの時間が短縮されます。

セキュリティ対策の強化

基になるテーブルに対するアクセス許可に関係なく、ストアド プロシージャを実行するためのアクセス許可をユーザーに提供できます。

SQL の関数

SQL Server は 2 種類の関数をサポートします

組み込み関数

組み込み関数は Transact-SQL 参照定義に従って動作し、変更できません。 Transact-SQL リファレンスで確立された構文に従う Transact-SQL ステートメントのみが、これらの関数をリファレンスとして使用できます。

システムはこれらの関数をすでに定義しています。 2 つのカテゴリに分類されます -

このチュートリアルでは、次の表を参照します -

45

スカラー関数

これらの操作は値を入力として受け取り、それを出力します。一部のシステム スカラー操作には、-

が含まれます。
  • round() - 数値を最も近い 3 桁に丸めます。たとえば、round(28.64851) は 28.649

  • を生成します。
リーリー
  • upper() - upper("english") は英語を返し、 lower("ENGLISH") は英語を返します。

リーリー ###出力### リーリー

  • rand()

    - 関数 rand() を使用すると、範囲内の乱数が返されます。たとえば、Rand(8) は、0.71372242401 またはその他のランダムに生成された数値を返します。

  • システム集計関数

これらの関数は単一の値を返し、これらの関数は入力パラメータのコレクションを受け取ります。例としては -

が挙げられます。

Avg()

提供されたすべての入力の平均値を提供します。 ######例### リーリー ###出力### リーリー Count()

この関数は、指定された条件を満たす行の数を返します。 ######例### リーリー ###出力### リーリー

Max() および min()

関数 max() および min() は、指定された引数の最大値と最小値を返します。 ######例### ###### リーリー ###出力### リーリー ###例### リーリー ###出力### リーリー

ユーザー定義関数

CREATE FUNCTION コマンドを使用して、カスタム Transact-SQL 関数を作成します。ユーザー定義関数は単一の値を提供し、0 個以上の入力パラメーターを必要とします。一部のユーザー定義関数 (UDF) は、10 進数、文字、整数などの単一のデータ値を返します。

スカラー演算

ユーザー定義のスカラー関数は、関数演算の各ステップの値を出力します。関数内の任意のデータ型値を返します。

テーブル値関数

インライン関数

ユーザー定義の値を持つインライン テーブル関数は操作を実行し、結果をテーブルとして返します。 BEGIN/END ボディはありません。結果を取得するには、SELECT ステートメントを使用するだけです。

マルチステートメント関数

ユーザー定義関数に変更できない SELECT ステートメントが含まれているか、複数の SELECT ステートメントが含まれている場合、結果は変わりません。テーブル変数を明示的に指定し、さまざまな SQL クエリから取得できる値を記述する必要があります。

ユーザー定義関数の利点

モジュール型プログラミングのサポート

関数を一度作成してデータベースに保存すると、ソフトウェア内で必要に応じて何度でも使用できます。ユーザー定義関数は、アプリケーションのソース コードを変更せずに変更できます。

実行を高速化できます

Transact-SQL ユーザー定義関数 (ストアド プロシージャなど) は、プランをキャッシュし、複数の実行でプランを再利用することでコンパイル コストを削減します。ユーザー定義関数は使用するたびに再解析して最適化する必要がないため、実行時間が大幅に短縮されます。

計算ワークロード、ビジネス ロジック、文字列操作では、CLR 関数は Transact-SQL 関数よりも大幅に優れたパフォーマンスを発揮します。データ アクセスが集中するロジックは、Transact-SQL 操作に適しています。

ネットワークアクティビティが低下する可能性があります。
  • 関数を使用すると、単一の数値式では表現できない複雑な制約に基づいて情報をフィルター処理する操作を表現できます。クライアントに提供される行数を減らすために、この関数を WHERE 句で使用できます。
  • ユーザー定義関数とストアド プロシージャの違い
  • 次の表は、SQL におけるユーザー定義関数とストアド プロシージャの主な違いを示しています -

  • ######標準######

    ユーザー定義関数
  • ストアド プロシージャ
  • 戻り値

単一値

#ID

######名前###### ######マーク###### ######年######

1
######厳しい######

90

19

2

確かに

50

20

3

プラティック

80
######21######

ダンラージ

95

19

######ラム######

85

18

単一、複数、またはゼロ #########電話######### ######不可能###### ######不可能######

パラメータ

入力値
入力値と出力値

データベース

変更できません
変更可能

#########声明#########
SELECT ステートメントのみ

SELECT および DML ステートメント

プロシージャからの呼び出し

関数から呼び出すことはできません

コンパイルと実行

毎回コンパイルする必要がある

コンパイルは 1 回のみ

トランザクション管理

###結論は### この記事では、ストアド プロシージャとその利点、関数、関数の種類、関数の利点について詳しく説明し、最後に関数とストアド プロシージャの違いに到達しました。

以上がSQL Server で関数とストアド プロシージャを作成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:tutorialspoint.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート