1.ストアドプロシージャとは何ですか?
ストアド プロシージャは一度コンパイルされ、複数回実行できます (ストアド プロシージャはコンパイル済みのコレクションであり、迅速に実行されます)。
2. 一般的に使用されるシステム ストアド プロシージャ
コード
-- 目的: 一般的に使用されるシステム ストアド プロシージャ
EXEC sp_databases -- 現在のシステム内のデータベースをリストします。
EXEC sp_renamedb 'test','test1' -- データベース名の変更 (シングル ユーザー アクセス)
stuDBを使用する
行く
EXEC sp_tables -- 現在のデータベースでクエリされたオブジェクトのリスト
EXEC sp_columns stuInfo -- テーブル列に関する情報を返します。
EXEC sp_help stuInfo -- テーブル stuInfo 情報の表示
EXEC sp_helpconstraint stuInfo -- テーブル stuInfo の制約を表示します。
EXEC sp_helpindex stuMarks -- テーブル stuMarks のインデックスを表示します。
EXEC sp_helptext 'view_stuInfo_stuMarks' -- ビューのステートメント テキストを表示します。
EXEC sp_stored_procedures -- 現在のデータベース内のストアド プロシージャのリストを返します。
マスターを使用する
行く
exec xp_cmdshell 'mkdir D:bank',no_output -- フォルダーの作成
3. カスタム ストアド プロシージャ
(1.) パラメータのないストアドプロシージャ
コード
スタッドを使用する
行く
存在する場合(select * from sysobjects where name='proc_stu')
プロシージャ proc_stu をドロップします
行く
プロシージャ proc_stu を作成する
として
DECLARE @writingAvg float,@labAvg float -- 筆記試験とコンピュータ試験の平均スコア変数
stuMarks から @WrittenAvg=AVG(WrittenExam)、@labAvg=AVG(labExam) を選択します
print '筆記試験の平均点:'+convert(varchar(5),@writeAvg)
print 'コンピュータテストの平均点:'+convert(varchar(5),@labAvg)
IF (@writeAvg>70 AND @labAvg>70)
print 'このクラスの試験結果: 優秀'
それ以外
print 'このクラスの試験結果: 悪い'
印刷 '------------------------------------------------ ――』
print 'この試験に合格しなかった学生:'
stuInfo から stuName、stuInfo.stuNo、WrittenExam、LabExam を選択します
内部結合 stuMarks ON stuInfo.stuNo=stuMarks.stuNo
WHERE 書かれたExam<60 OR labExam<60
行く
exec proc_stu -- ストアド プロシージャを実行します (2.) 入力パラメータを使用したストアド プロシージャ
コード
stuDBを使用する
行く
/*---存在するかどうかを検出します。ストアド プロシージャはシステム テーブル sysobjects に保存されています---*/
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'proc_stu' )
ドロッププロシージャ proc_stu
行く
/*---ストアド プロシージャの作成----*/
プロシージャの作成 proc_stu
@writePass int、
@labPass int -- パラメータを指定せずに実行がこの exec proc_stu のように行われるように、デフォルト値を追加できます。
として
print '合格点の書き込み:'+convert(varchar(5),@writePass)
print 'コンピュータテスト合格行:'+convert(varchar(5),@labPass)
印刷 '------------------------------------------------ ――』
print 'この試験に合格しなかった学生:'
stuInfo から stuName、stuInfo.stuNo、WrittenExam、LabExam を選択します
内部結合 stuMarks ON stuInfo.stuNo=stuMarks.stuNo
WHEREWrittenExam<@WrittenPass OR labExam<@labPass
行く
実行 proc_stu 60,55
exec proc_stu 60,@labPass=55
exec proc_stu @WrittenPass=60,@labPass=55
exec proc_stu @writingPass=60,55 -- この行はエラーを報告します: パラメータ 2 を渡す必要があり、後続のパラメータは「@name = value」の形式で渡す必要があります。
-- 「@name = value」形式を使用した後は、後続のすべてのパラメータを「@name = value」形式で渡す必要があります。
(3.) 出力パラメータを含むストアド プロシージャ
コード
stuDBを使用する
行く
/*---存在するかどうかを検出します。ストアド プロシージャはシステム テーブル sysobjects に保存されています---*/
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'proc_stu' )
ドロッププロシージャ proc_stu
行く
/*---ストアド プロシージャの作成----*/
プロシージャの作成 proc_stu
@notpassSum int OUTPUT、--OUTPUT キーワード、それ以外の場合は入力パラメータとみなされます
@writePass int=60, --デフォルトのパラメータは後に置かれます
@labPass int=60 --デフォルトのパラメータは後に置かれます
として
print '合格点の書き込み:'+convert(varchar(5),@writePass)
+ 'コンピュータベースのテスト合格行:'+convert(varchar(5),@labPass)
印刷 '------------------------------------------------ ――』
print 'この試験に合格しなかった学生:'
stuInfo から stuName、stuInfo.stuNo、WrittenExam、LabExam を選択します
内部結合 stuMarks ON stuInfo.stuNo=stuMarks.stuNo
WHEREWrittenExam<@WrittenPass OR labExam<@labPass
/*--試験に不合格になった学生の数を数えて返します--*/
SELECT @notpassSum=COUNT(stuNo)FROM stuMarks
WHEREWrittenExam<@WrittenPass OR labExam<@labPass
行く
/*---ストアド プロシージャの呼び出し----*/
@sum int を宣言
EXEC proc_stu @sum OUTPUT ,64 -- コンピュータ テストの合格点はデフォルト値を採用します。筆記試験の合格点は 64 点、コンピュータ テストの合格点は 60 点です。
印刷 '------------------------------------------------ ――』
IF @sum>=3
print '不合格者の数:'+convert(varchar(5),@sum)+ '60%以上の人は合格点を下げる必要があります'
それ以外
print '不合格者数:'+convert(varchar(5),@sum)+ '合格者数は60%未満に抑えられており、合格点は中程度です'
行く