sql >> データベース >  >> RDS >> Sqlserver

SQL Server 2016:ストアドプロシージャを作成する

    ストアドプロシージャは、1つにコンパイルされたSQLステートメントのグループです。ストアドプロシージャには、ビジネスロジックやその他のプログラミング構造を含めることができます。

    SQL Serverでは、ストアドプロシージャは、1つ以上のTransact-SQLステートメントのグループ、またはMicrosoft .NET Frameworkの共通ランタイム言語(CLR)メソッドへの参照です。

    プログラマビリティ

    ただし、ストアドプロシージャは、単なる長いスクリプトではありません。これは、特に ストアドプロシージャ の下でSQLServerに保存されたスクリプトです。 ノード、およびそれはできます:

    • 入力パラメーターを受け入れます(そして、呼び出し側プログラムに出力パラメーターの形式で複数の値を返します)。
    • プログラミングステートメントが含まれています。
    • ステータス値を呼び出し元のプログラムに返し、成功または失敗、および失敗の理由を示します。

    ストアドプロシージャには、多くの場合、ビジネスロジックが含まれています。たとえば、ストアドプロシージャは、渡されたパラメータを受け入れ、IFを使用してそれらのパラメータに対してテストできます。 ステートメント。たとえば、パラメータが1つの値の場合はこれを行い、別の値の場合はこれを行います。

    ストアドプロシージャは、作成されるとすぐに解析および最適化されてからメモリに格納されるため、アプリケーションのパフォーマンスを向上させることができます。ストアドプロシージャを介した条件付きクエリの実行は非常に高速です。ネットワークを介してSQLServerにクエリを送信し、ネットワークを介してすべてのデータを返し、フィルタリングして選択できるアプリケーションと比較して、関心のあるレコードのみ。

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

    ストアドプロシージャを使用する主な利点のいくつかを次に示します。

    メリット 説明
    モジュラープログラミング ストアドプロシージャを一度作成してから、アプリケーションのさまざまな部分から(さらには複数のアプリケーションからでも)何度も呼び出すことができます。
    パフォーマンス ストアドプロシージャは、コードの実行を高速化し、ネットワークトラフィックを削減します。
    • より高速な実行:ストアドプロシージャは、作成されてメモリに格納されるとすぐに解析および最適化されます。これは、アプリケーションからSQLServerにSQLコードの多くの行を送信するよりもはるかに高速に実行されることを意味します。そのためには、SQLServerが実行するたびにSQLコードをコンパイルして最適化する必要があります。
    • ネットワークトラフィックの削減:ネットワークを介してSQLコードの多くの行をSQL​​ Serverに送信すると、ネットワークのパフォーマンスに影響します。これは、数百行のSQLコードがある場合や、アプリケーションで多くのアクティビティがある場合に特に当てはまります。 SQL Serverで(ストアドプロシージャとして)コードを実行すると、このコードをネットワーク経由で送信する必要がなくなります。唯一のネットワークトラフィックは、提供されたパラメータとクエリの結果です。
    セキュリティ ユーザーは、ステートメントを直接実行しなくても、ストアドプロシージャを実行できます。したがって、ストアドプロシージャは、通常はこれらのタスクにアクセスできないユーザーに高度なデータベース機能を提供できますが、この機能は厳密に制御された方法で利用できるようになります。

    ストアドプロシージャを作成する方法

    ストアドプロシージャを作成するには、CREATE PROCEDUREを使用します ステートメントの後に、ストアドプロシージャを構成するコードが続きます。ストアドプロシージャがパラメータを受け入れる場合は、名前の後にパラメータを含める必要があります。

    CREATE PROCEDURE myStoredProcedure AS
    ...
    
    OR
    
    CREATE PROCEDURE myStoredProcedure @ParameterName DataType AS
    ...

    ここで、前に作成したビューの1つである RecentAlbums に基づいてストアドプロシージャを作成します。 ビュー。

    このビューは、過去20年間にリリースされたすべてのアルバムを返します。 20年を振り返るだけでよいのであれば、これで問題ありません。しかし、何年をカバーするかをユーザーに選択させたい場合はどうでしょうか。

    ストアドプロシージャはこの問題を解決できます。

    パラメータを受け入れるストアドプロシージャを作成します。パラメータの値は、検索し直す年数になります。したがって、この値は、ユーザーがストアドプロシージャを実行するたびに指定できます。

    1. ストアドプロシージャの設計

      新しいクエリウィンドウを開き、ストアドプロシージャのコードを追加します。

      この場合、 RecentArtists からコードをコピーして貼り付けます 上部を表示および変更して、ストアドプロシージャになるようにします。

      @Countというパラメータを追加します これにより、ストアドプロシージャを何年振り返る必要があるかが決まります。

      したがって、ハードコードされた20の値を置き換えます @Countを使用

      サンプルコード

      この例のコードは次のとおりです。

      CREATE PROCEDURE spRecentAlbums @Count int
      AS
      SELECT  Albums.ReleaseDate, 
              Albums.AlbumName, 
              Genres.Genre, 
              Artists.ArtistName,
              Artists.ActiveFrom
      FROM Albums 
      INNER JOIN
              Artists ON 
              Albums.ArtistId = Artists.ArtistId 
              INNER JOIN
                  Genres ON 
                  Albums.GenreId = Genres.GenreId
      WHERE   (Albums.ReleaseDate > DATEADD(year, - @Count, GETDATE()));
    2. ストアドプロシージャを作成する

      すべて問題がなければ、ステートメントを実行してストアドプロシージャを作成できます。

      実行をクリックします ストアドプロシージャを作成します。

      ストアドプロシージャが作成されると、オブジェクトエクスプローラーで確認できます(ストアドプロシージャを更新する必要がある場合があります) ノードファースト)。

    3. ストアドプロシージャを実行する

      作成されたので、ストアドプロシージャを実行できます。

      新しいクエリウィンドウを開き、これを追加します:

      EXEC spRecentAlbums @Count = 5;

      次に、実行をクリックします ツールバーから。

      ストアドプロシージャは、過去5年間にリリースされたすべてのアルバムを返します。

    4. さまざまなパラメータを試してください

      パラメータの値を変更して、これが結果にどのように影響するかを確認してください。

      複数のステートメントを次々に実行することもできます。ステートメントごとに新しい結果ペインが表示されます。

    ストアドプロシージャテンプレート

    SQL Server 2016では、 ストアドプロシージャ を右クリックしてストアドプロシージャを作成できます。 オブジェクトエクスプローラーでノードを選択し、 新規>ストアドプロシージャ... を選択します。 または New>ネイティブにコンパイルされたストアドプロシージャ...

    これにより、独自の特定の手順を入力する準備ができたテンプレートが開きます。

    GUIを介してストアドプロシージャを実行する

    グラフィカルユーザーインターフェイスを使用して、ストアドプロシージャを実行することもできます。

    1. 実行手順 を起動します ダイアログボックス

      オブジェクトエクスプローラーで、ストアドプロシージャを右クリックし、ストアドプロシージャの実行...を選択します。 。

    2. 供給パラメータ

      ストアドプロシージャに必要なパラメータの値を入力し、[ OK]をクリックします 。

    3. 結果

      結果が表示されます。

    ストアドプロシージャを変更する

    既存のストアドプロシージャを変更する必要がある場合は、CREATEを置き換えるだけです。 ALTERを使用 (更新された手順とともに)

    この例では、結果がリリース日で降順でソートされるようにストアドプロシージャを変更します。

    ALTER PROCEDURE spRecentAlbums @Count int
    AS
    SELECT  Albums.ReleaseDate, 
            Albums.AlbumName, 
            Genres.Genre, 
            Artists.ArtistName,
            Artists.ActiveFrom
    FROM Albums 
    INNER JOIN
            Artists ON 
            Albums.ArtistId = Artists.ArtistId 
            INNER JOIN
                Genres ON 
                Albums.GenreId = Genres.GenreId
    WHERE   (Albums.ReleaseDate > DATEADD(year, - @Count, GETDATE()))
    ORDER BY Albums.ReleaseDate DESC;

    システムストアドプロシージャ

    SQL Serverには、データベース管理タスクを支援するための多数のシステムストアドプロシージャが含まれています。 GUIを介して実行できるタスクの多くは、システムストアドプロシージャを介して実行できます。たとえば、システムストアドプロシージャで実行できることには、次のようなものがあります。

    • セキュリティアカウントを構成する
    • リンクサーバーを設定する
    • データベース保守計画を作成する
    • 全文検索カタログを作成する
    • リモートログインを追加する
    • レプリケーションを構成する
    • スケジュールされたジョブを設定する
    • その他...

    システムストアドプロシージャの前には sp_ が付いています 、したがって、独自のプロシージャにそのプレフィックスを使用することは避けるのが最善です。

    命名規則

    ストアドプロシージャ(およびデータベース内の他のすべてのオブジェクト)に対して一貫した命名規則を作成することをお勧めします。

    ストアドプロシージャの前に usp_ を付ける人もいます (ユーザー定義のストアドプロシージャを示すため)、他の人は select などのSQLキーワードで始めます 、 挿入 update 削除 。アプリケーションの略語を使用する人もいます。

    ストアドプロシージャ内の各単語をアンダースコアで区切るものもあります(例: recent_albums )、他の人はタイトルケースを使用します(例: RecentAlbums

    したがって、使用されている命名規則に応じて、ストアドプロシージャに次のいずれかの名前が付けられる可能性があります。

    • RecentAlbums
    • 最近のアルバム
    • uspRecentAlbums
    • usp_recent_albums
    • selectRecentAlbums
    • select_RecentAlbums
    • select_recent_albums
    • getRecentAlbums
    • get_recent_albums

    あなたは絵を手に入れます。重要なのは一貫性です。いずれかを選択し、それに固執します。ストアドプロシージャを使用する必要がある場合に簡単になります。スコア、または数百のストアドプロシージャがあると想像してください。実行するたびに、オブジェクトエクスプローラーでそのプロシージャに移動する必要があります。これは、それを usp_RecentAlbums と呼んだかどうかを思い出せないためです。 または uspRecentAlbums

    前述のように、 sp_ の使用は避けてください ストアドプロシージャ名のプレフィックスとして。 SQL Serverは、このプレフィックスをシステムストアドプロシージャに使用します。

    SQL Serverは最初にシステムのストアドプロシージャを検索するため、せいぜいパフォーマンスが低下します。最悪の場合、プロシージャは実行されません(システムストアドプロシージャと名前を共有している場合)。


    1. 現在のタイムスタンプに2か月を追加します

    2. Oracle jdbcドライバークラスの違いは?

    3. SQLiteで重複行を選択する6つの方法

    4. MayBeSQLがMicrosoftAccessに登場!