1.什么是存儲(chǔ)過程?
存儲(chǔ)過程是一次編譯可多次運(yùn)行(存儲(chǔ)過程存放在服務(wù)器中),預(yù)編譯好的集合,運(yùn)行速度快。
2.常用系統(tǒng)存儲(chǔ)過程
代碼
-- Purpose: 常用系統(tǒng)存儲(chǔ)過程使用
EXEC sp_databases --列出當(dāng)前系統(tǒng)中的數(shù)據(jù)庫
EXEC sp_renamedb 'test','test1'--改變數(shù)據(jù)庫名稱(單用戶訪問)
USE stuDB
GO
EXEC sp_tables --當(dāng)前數(shù)據(jù)庫中查詢的對(duì)象的列表
EXEC sp_columns stuInfo --返回某個(gè)表列的信息
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 --返回當(dāng)前數(shù)據(jù)庫中的存儲(chǔ)過程列表
use master
go
exec xp_cmdshell 'mkdir D:\bank',no_output--創(chuàng)建文件夾
3.自定義存儲(chǔ)過程
(1.)不帶參數(shù)的存儲(chǔ)過程
代碼
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 --筆試和機(jī)試平均分變量
SELECT @writtenAvg=AVG(writtenExam), @labAvg=AVG(labExam) FROM stuMarks
print '筆試平均分:'+convert(varchar(5),@writtenAvg)
print '機(jī)試平均分:'+convert(varchar(5),@labAvg)
IF (@writtenAvg>70 AND @labAvg>70)
print '本班考試成績(jī):優(yōu)秀'
ELSE
print '本班考試成績(jī):較差'
print '--------------------------------------------------'
print ' 參加本次考試沒有通過的學(xué)員:'
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 --執(zhí)行存儲(chǔ)過程
(2.)帶輸入?yún)?shù)的存儲(chǔ)過程
代碼
USE stuDB
GO
/*---檢測(cè)是否存在:存儲(chǔ)過程存放在系統(tǒng)表sysobjects中---*/
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'proc_stu' )
DROP PROCEDURE proc_stu
GO
/*---創(chuàng)建存儲(chǔ)過程----*/
CREATE PROCEDURE proc_stu
@writtenPass int,
@labPass int-- 可以添加默認(rèn)值 這樣 執(zhí)行可以是這樣的 exec proc_stu 不用指定參數(shù)了
AS
print '筆試及格線:'+convert(varchar(5),@writtenPass)
print '機(jī)試及格線:'+convert(varchar(5),@labPass)
print '--------------------------------------------------'
print ' 參加本次考試沒有通過的學(xué)員:'
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--這一行會(huì)報(bào)錯(cuò) :必須傳遞參數(shù) 2,并以
'@name = value' 的形式傳遞后續(xù)的參數(shù)。
--
一旦使用了 '@name = value' 形式之后,所有后續(xù)的參數(shù)就必須以 '@name = value' 的形式傳遞
(3.)帶輸出參數(shù)的存儲(chǔ)過程
代碼
USE stuDB
GO
/*---檢測(cè)是否存在:存儲(chǔ)過程存放在系統(tǒng)表sysobjects中---*/
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'proc_stu' )
DROP PROCEDURE proc_stu
GO
/*---創(chuàng)建存儲(chǔ)過程----*/
CREATE PROCEDURE proc_stu
@notpassSum int OUTPUT, --OUTPUT關(guān)鍵字,否則視為輸入?yún)?shù)
@writtenPass int=60, --默認(rèn)參數(shù)放后
@labPass int=60 --默認(rèn)參數(shù)放后
AS
print '筆試及格線:'+convert(varchar(5),@writtenPass)
+ ' 機(jī)試及格線:'+convert(varchar(5),@labPass)
print '--------------------------------------------------'
print ' 參加本次考試沒有通過的學(xué)員:'
SELECT stuName,stuInfo.stuNo,writtenExam,labExam FROM stuInfo
INNER JOIN stuMarks ON stuInfo.stuNo=stuMarks.stuNo
WHERE writtenExam<@writtenPass OR labExam<@labPass
/*--統(tǒng)計(jì)并返回沒有通過考試的學(xué)員人數(shù)--*/
SELECT @notpassSum=COUNT(stuNo)FROM stuMarks
WHERE writtenExam<@writtenPass OR labExam<@labPass
GO
/*---調(diào)用存儲(chǔ)過程----*/
DECLARE @sum int
EXEC proc_stu @sum OUTPUT ,64 --機(jī)試及格線采用默認(rèn)值:筆試及格線64分,機(jī)試及格線60分。
print '--------------------------------------------------'
IF @sum>=3
print '未通過人數(shù):'+convert(varchar(5),@sum)+ '人,超過60%,及格分?jǐn)?shù)線還應(yīng)下調(diào)'
ELSE
print '未通過人數(shù):'+convert(varchar(5),@sum)+ '人,已控制在60%以下,及格分?jǐn)?shù)線適中'
GO
資料引用:http://www.knowsky.com/543963.html