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

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

SQL Server のストアドプロシージャには、ユーザー定義ストアドプロシージャ、システムストアドプロシージャ、拡張ユーザー定義ストアドプロシージがあります。

今回は、ユーザー定義ストアドプロシージャを作成してみましょう。

こちら のスクリプトを実行して、テーブルを再生成しておいてください。 全てのテーブルは使いませんが、これらのテーブルが存在している前提で進めます。

ユーザー定義ストアドプロシージャ

ユーザー定義ストアドプロシージャを作成するには CREATE PROCEDURE を使います。 シンプルなユーザー定義のストアドプロシージャを作成する構文は次の通りです。

CREATE PROCEDURE [ ストアドプロシージャ名 ]
    [ @入力パラメーター名 1 ] [ 入力パラメーター名 1 のデータ型 ],
    [ @入力パラメーター名 2 ] [ 入力パラメーター名 2 のデータ型 ],
    [ @入力パラメーター名 3 ] [ 入力パラメーター名 3 のデータ型 ],
    ..
AS
BEGIN

     [ ストアドプロシージャで処理したい一連の T-SQL ステートメント ]

END;

[ ストアドプロシージャで処理したい一連の T-SQL ステートメント ] には、ユーザー定義関数とは違って、テーブルの値を挿入・変更・削除等のスコープ外のリソースを変更するステートメントを書くことができます

入力パラメーターには、また本サイトの T-SQL 入門では説明していませんが 「 ユーザー定義テーブル型 」 も指定することができます。


それでは、ユーザー定義ストアドプロシージャを作ってみましょう。

StudentID を入力パラメータとして受け取り、TestResult テーブルにその StudentID のデータが存在すれば、アウトプットパラメータで 「 TestResult が存在するので削除できません。 」 というメッセージを返し、存在していなければ Student テーブルから、その StudentID のレコードを削除する uspStudentDelete という名前のストアドプロシージャを作ってみます。

CREATE PROCEDURE uspStudentDelete
    @StudentID      INT,
    @ErrorMessage   NVARCHAR(100) OUT
AS
BEGIN

    IF EXISTS
        (SELECT *
         FROM   TestResult
         WHERE  StudentID = @StudentID)
    BEGIN

        SET @ErrorMessage = N'TestResult が存在するので削除できません。';

    END
    ELSE
    BEGIN

        DELETE
        FROM    Student
        WHERE   StudentID = @StudentID;

    END

END;

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

アウトプットパラメタの後ろには OUTPUT または OUT というキーワードをつけます。

上記のスクリプトを実行すると、ユーザー定義ストアドプロシージャ uspStudentDelete ができました。

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


それでは、作ったユーザー定義のストアドプロシージャを使ってみましょう。

現在の Student テーブルと TestResult テーブルのデータは次のようになっています。

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

TestResult テーブルにデータが存在する、StudentID = 1 のデータを削除してみます。

DECLARE @ErrorMessage NVARCHAR(100);

EXEC uspStudentDelete 
        1, 
        @ErrorMessage OUTPUT;

PRINT @ErrorMessage;

[ 実行結果 ]
SQL Server のストアドプロシージャを作成する 4

「 TestResult が存在するので削除できません。 」 というメッセージが返ってきました。

ここの呼び出し側で OUTPUT のキーワードを忘れると、エラーは出ずに実行され、ただ戻り値が取得できないのでご注意ください。


次に、TestResult テーブルにデータが存在しない、StudentID = 6 のデータを削除してみます。

DECLARE @ErrorMessage NVARCHAR(100);

EXEC uspStudentDelete 
        6, 
        @ErrorMessage OUTPUT;

PRINT @ErrorMessage;

[ 実行結果 ]
SQL Server のストアドプロシージャを作成する 5

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

エラーメッセージは返ってこずに、Student テーブルのレコードが削除されましたね。


次は、SQL Server のストアドプロシージャを変更・削除してみましょう。

© 2010-2024 SQL Server 入門