存儲過程是預編譯的SQL語句的集合,這些語句存儲在一個名稱下並做爲一個單元處理。存儲過程代替了傳統的逐條執行sql語句的方式。一個存儲過程當中可包含查詢、插入、更新、刪除等操做的一系列sql語句。當這個存儲過程被調用執行時,這些操做也會同時執行sql
存儲過程與其餘編程語言的過程相似,它能夠接受輸入參數,並以輸出參數的格式向調用過程或批處理返回多個值;包含用於在數據庫中執行操做(包括調用其餘過程的)的編程語句;向調用過程或批處理返回狀態值,以指明成功或失敗(以及失敗的緣由)。數據庫
create proc [EDURE] procedure_name [:number] [{@parameter data_type} [VARYING] [=default] [OUTPUT] ] [...n] AS sql_statement
參數 | 描述 |
---|---|
create procedure | 關鍵字,也能夠寫成create proc |
procedure_name | 建立的存儲過程名字 |
number | 對存儲過程進行分組 |
@parameter | 存儲過程參數,存儲過程能夠聲明一個或多個參數 |
data_type | 參數的數據類型,全部數據類型(包括text,ntext和image)都可以用做存儲過程的參數,但cursor數據類型只能用於OUTPUT參數 |
VARYING | 可選項,指定做爲輸出參數支持的結果集(由存儲過程動態構造,內容能夠變化),該關鍵字僅適用於遊標參數 |
default | 可選項,表示爲參數設置默認值 |
OUTPUT | 可選項,代表參數是返回參數,能夠將參數值返回給調用的過程 |
n | 表示能夠定義多個參數 |
AS | 指定存儲過程要執行的操做 |
sql_statement | 存儲過程當中的過程體 |
--存儲過程查詢全部數據 --begin...end 相似編程語言中的{} create proc stu1 as begin select * from student; end go exec stu1 go -------------------------------------------------------------------------- -------------------------------------------------------------------------- --存儲過程根據條件用戶名查詢用戶信息 create proc stu2 @sname varchar(50) --聲明全局變量 as begin select * from student s where s.stuName=@sname; end go exec stu2 '王男' go -------------------------------------------------------------------------- -------------------------------------------------------------------------- --存儲過程內部設定用戶名查詢用戶信息 create proc stu3 @sname varchar(50)='王男' as begin select * from student s where s.stuName=@sname; end go exec stu3 go -------------------------------------------------------------------------- -------------------------------------------------------------------------- --存儲過程根據用戶名查詢是否存在這個用戶信息 create proc stu4 @sname varchar(50), @result varchar(8) output --輸出參數 as begin if (select COUNT(1) from student s where s.stuName=@sname)>0 --if exists (select COUNT(1) from student s where s.stuName=@sname) set @result='存在!' else set @result='不存在!' end go declare @result varchar(8) exec stu4 '王男1',@result output print @result go -------------------------------------------------------------------------- -------------------------------------------------------------------------- --存儲過程內部設定局部變量用戶名來查詢用戶信息 create proc stu5 as declare @sname varchar(50) --局部變量聲明 set @sname='楊冪' begin select * from student s where s.stuName=@sname end go exec stu5 go -------------------------------------------------------------------------- -------------------------------------------------------------------------- --存儲過程根據條件用戶學號查詢用戶名 create proc stu6 @stuNo varchar(50) as declare @sname varchar(50) set @sname=(select s.stuName from student s where s.stuNo=@stuNo) select @sname go exec stu6 '01' go -------------------------------------------------------------------------- -------------------------------------------------------------------------- --存儲過程插入用戶信息 create proc stu7 @stuNo varchar(50), @stuName varchar(50), @stuAge datetime, @stuSex varchar(5) as begin insert into student (stuNo,stuName,stuAge,stuSex) values (@stuNo,@stuName,@stuAge,@stuSex) end go exec stu7 '07','王莽','2000-9-9 9:9:9','女' go -------------------------------------------------------------------------- -------------------------------------------------------------------------- --存儲過程根據用戶名來刪除對應的用戶信息 --@@rowcount返回操做條數 --return返回信息,終止下面的操做 create proc stu8 @stuName varchar(50) as begin delete from student where stuName=@stuName return @@rowcount end go declare @result varchar(50) exec @result=stu8 '王莽' select @result as '刪除條數' --print @result go -------------------------------------------------------------------------- -------------------------------------------------------------------------- --存儲過程根據用戶學號來查詢他的平均分 create proc stu9 @stuNo varchar(50), @avg int output as begin set @avg=(select AVG(courseScore) from course where stuNo=@stuNo) --等同 --select @avg=AVG(courseScore) from course where stuNo=@stuNo end go declare @avg int exec stu9 '02',@avg output print @avg go -------------------------------------------------------------------------- -------------------------------------------------------------------------- --存儲過程根據用戶學號來聯合查詢用戶信息和課程信息 create proc stu10 @stuNo varchar(50) as select c.stuNo,s.stuName,s.stuAge,s.stuSex,c.courseName,c.courseScore from student s join course c on s.stuNo=c.stuNo where s.stuNo=@stuNo go exec stu10 '02' go -------------------------------------------------------------------------- -------------------------------------------------------------------------- --存儲過程判斷學號是否存在,不存在,插入用戶信息,返回消息;存在,返回信息 create proc stu11 @stuNo varchar(50), @stuName varchar(50), @stuAge datetime, @stuSex varchar(5), @result varchar(50) output as if exists (select * from student where stuNo=@stuNo) begin set @result='對不起,學號已存在!' end else begin insert into student (stuNo,stuName,stuAge,stuSex) values (@stuNo,@stuName,@stuAge,@stuSex) set @result='恭喜你,用戶信息插入成功!' end go declare @result varchar(50) exec stu11 '06','王忠磊','1980-8-8 8:9:0','男',@result output print @result -------------------------------------------------------------------------- -------------------------------------------------------------------------- --存儲過程查詢當前用戶的平均成績與總的平均成績之間的關係 create proc stu12 @stuNo varchar(50) as declare @curAvg decimal(18,2) declare @totalAvg decimal(18,2) if exists(select * from course where stuNo=@stuNo) begin set @totalAvg=(select AVG(courseScore) from course) select @curAvg=AVG(courseScore) from course where stuNo=@stuNo print ('總的平均分:'+convert(varchar(18),@totalAvg)) print ('該生的平均分:'+convert(varchar(18),@curAvg)) if @curAvg>@totalAvg print '高於平均水平!' else print '低於平均水平!' end else print '該生對應的分數信息不存在,請從新查詢!' go exec stu12 '03' go
sqlserver存儲過程學習(通俗易懂)_英雄主義-CSDN博客_sqlserver 存儲過程編程
管理存儲過程緩存
執行存儲過程服務器
存儲過程建立完成後,能夠經過execute執行,簡寫爲exec編程語言
[{exec|execute}] { [@return_status=] {module_name[;number]|@modlue_name_var} [[@parameter=]{value |@variable[OUTPUT] |[DEFAULT] } ] [...n] [WITH RECOMPILE] }
參數 | 描述 |
---|---|
@return_status | 可選的整型變量,存儲模塊的返回狀態。這個變量execute語句前,必須在批處理、存儲過程或函數中聲明過 |
module_name | 是要調用的存儲過程或標量值用戶定義函數的徹底限定或者不徹底限定的名稱。模塊名稱必須符合標識符規則。不管服務器的排序規則如何,擴展存儲過程的名稱老是區分大小寫 |
number | 是可選整數,用於對同名的過程分組。該參數不能用於擴展存儲過程 |
@module_name_var | 是局部定義的變量名,表明模塊名稱 |
@parameter | module_name的參數,與在模塊中定義的相同,參數名稱前必須加上「@」符號 |
value | 傳遞給模塊或傳遞命令的參數值,若是參數名稱沒有指定,參數值必須以在模塊中定義的順序提供 |
@variable | 是用來存儲參數或返回參數變量 |
OUTPUT | 指定模塊或命令字符串返回一個參數,該模塊或命令字符串中的匹配參數也必須使用關鍵字OUTPUT建立。使用遊標變量做爲參數時使用該關鍵字 |
DEFAULT | 根據模塊的定義,提供參數的默認值。當模塊須要的參數值沒有定義默認值而且缺乏參數或指定了DEFAULT關鍵字,會出現錯誤 |
WITH RECOMPILE | 指定模塊後,強制編譯、使用和放棄新計劃。若是該模塊存在現有查詢計劃,則該計劃將保留在緩存中 |
查看存儲過程函數
使用sys.sql_modules查看存儲過程的定義sqlserver
select * from sys.sql_modules
-- object_id 要查看的存儲過程id select OBJECT_DEFINITION(object_id)
sp_helptext 'proc_student'