1.什麼是預存程序?
預存程序是一次編譯可多次執行(預存程序存放在伺服器),預先編譯好的集合,運作速度快。
2.常用系統儲存過程
程式碼
-- Purpose: 常用系統預存程序使用
EXEC sp_databases --列出目前系統中的資料庫
EXEC sp_renamedb 'test','test1'--改變資料庫名稱(單一使用者存取)
USE stuDB
GO
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 --傳回目前資料庫中的預存程序列表
use master
go
exec xp_cmdshell 'mkdir D:bank',no_output--建立資料夾
3.自訂預存程序
(1.)不帶參數的預存程序
程式碼
use studb
go
if exists(select * from sysobjects where name='proc_stu')
drop proc proc_stu
go
create procedure proc_stu
AS
DECLARE @writtenAvg float,@labAvg float --筆試和機試平均分變量
SELECT @writtenAvg=AVG(writtenExam), @labAvg=AVG(labExam) FROM stuMarks
print '筆試平均分數:'+convert(varchar(5),@writtenAvg)
print '機試平均分數:'+convert(varchar(5),@labAvg)
IF (@writtenAvg>70 AND @labAvg>70)
print '本班考試成績:優'
ELSE
print '本班考試成績:較差'
print '------------------------------------------------ --'
print ' 參加本次考試沒有通過的學員:'
SELECT stuName,stuInfo.stuNo,writtenExam,labExam FROM stuInfo
INNER JOIN stuMarks ON stuInfo.stuNo=stuMarks.stuNo
WHERE writtenExam<60 OR labExam<60
GO
exec proc_stu --執行預存程序(2.)帶有輸入參數的預存程序
程式碼
USE stuDB
GO
/*---檢測是否存在:預存程序存放在系統表sysobjects中---*/
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'proc_stu' )
DROP PROCEDURE proc_stu
GO
/*---建立預存程序----*/
CREATE PROCEDURE proc_stu
@writtenPass int,
@labPass int-- 可以加入預設值這樣執行可以是這樣的exec proc_stu 不用指定參數了
AS
print '筆試及格線:'+convert(varchar(5),@writtenPass)
print '機試及格線:'+convert(varchar(5),@labPass)
print '------------------------------------------------ --'
print ' 參加本次考試沒有通過的學員:'
SELECT stuName,stuInfo.stuNo,writtenExam,labExam FROM stuInfo
INNER JOIN stuMarks ON stuInfo.stuNo=stuMarks.stuNo
WHERE writtenExam<@writtenPass OR labExam<@labPass
GO
exec proc_stu 60,55
exec proc_stu 60,@labPass=55
exec proc_stu @writtenPass=60,@labPass=55
exec proc_stu @writtenPass=60,55--這一行會報錯:必須傳遞參數2,並以'@name = value' 的形式傳遞後續的參數。
-- 一旦使用了'@name = value' 形式之後,所有後續的參數就必須以'@name = value' 的形式傳遞
(3.)帶輸出參數的預存過程
程式碼
USE stuDB
GO
/*---檢測是否存在:預存程序存放在系統表sysobjects中---*/
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'proc_stu' )
DROP PROCEDURE proc_stu
GO
/*---建立預存程序----*/
CREATE PROCEDURE proc_stu
@notpassSum int OUTPUT, --OUTPUT關鍵字,否則視為輸入參數
@writtenPass int=60, --預設參數放後
@labPass int=60 --預設參數放後
AS
print '筆試及格線:'+convert(varchar(5),@writtenPass)
+ ' 機試及格線:'+convert(varchar(5),@labPass)
print '------------------------------------------------ --'
print ' 參加本次考試沒有通過的學員:'
SELECT stuName,stuInfo.stuNo,writtenExam,labExam FROM stuInfo
INNER JOIN stuMarks ON stuInfo.stuNo=stuMarks.stuNo
WHERE writtenExam<@writtenPass OR labExam<@labPass
/*--統計並回傳沒有通過考試的學員人數--*/
SELECT @notpassSum=COUNT(stuNo)FROM stuMarks
WHERE writtenExam<@writtenPass OR labExam<@labPass
GO
/*---呼叫預存程序----*/
DECLARE @sum int
EXEC proc_stu @sum OUTPUT ,64 --機試及格線採用預設值:筆試及格線64分,機試及格線60分。
print '------------------------------------------------ --'
IF @sum>=3
print '未通過人數:'+convert(varchar(5),@sum)+ '人,超過60%,及格分數線也應下調'
ELSE
print '未通過人數:'+convert(varchar(5),@sum)+ '人,已控制在60%以下,及格分數線適中'
GO