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;
アウトプットパラメタの後ろには OUTPUT または OUT というキーワードをつけます。
上記のスクリプトを実行すると、ユーザー定義ストアドプロシージャ uspStudentDelete ができました。
それでは、作ったユーザー定義のストアドプロシージャを使ってみましょう。
現在の Student テーブルと TestResult テーブルのデータは次のようになっています。
TestResult テーブルにデータが存在する、StudentID = 1 のデータを削除してみます。
DECLARE @ErrorMessage NVARCHAR(100); EXEC uspStudentDelete 1, @ErrorMessage OUTPUT; PRINT @ErrorMessage;
[ 実行結果 ]
「 TestResult が存在するので削除できません。 」 というメッセージが返ってきました。
ここの呼び出し側で OUTPUT のキーワードを忘れると、エラーは出ずに実行され、ただ戻り値が取得できないのでご注意ください。
次に、TestResult テーブルにデータが存在しない、StudentID = 6 のデータを削除してみます。
DECLARE @ErrorMessage NVARCHAR(100); EXEC uspStudentDelete 6, @ErrorMessage OUTPUT; PRINT @ErrorMessage;
[ 実行結果 ]
エラーメッセージは返ってこずに、Student テーブルのレコードが削除されましたね。
次は、SQL Server のストアドプロシージャを変更・削除してみましょう。