--用户自定义的存储过程

--create proc 存储过程名称

--【参数列表】

--as

--begin

--具体的业务逻辑

--end

--go

--1 创建存储过程,完成客户信息表中客户编号,客户名称的查询

--create proc p_customerinfo

--as

--begin

--select CustomerID,CustomerName from Customer

--end

--go

--执行存储过程 /调用存储过程 

--execute/exec 存储过程名称 [对应参数]

--execute p_customerinfogo

--修改存储过程

--alter proc 待修改存储过程名称

--[参数列表]

--as

--新的业务逻辑

--alter proc p_customerinfo

--as

--begin

--select CustomerName,Gender from Customer

--end

--go

--删除存储过程

--drop proc p_customerinfo

--go

--练习 创建一个存储过程,完成商品表中类别编号为1下的商品的名称,

--价格,和类别名称

--调用该存储过程--优化,

--在创建之前,先判断一下存储过程的名字是否已经存在,

--如果存在,则删除

--if exists(select * from sysobjects where name='p_productinfo') 

--drop proc p_productinfo 

--go

--create proc p_productinfo

--as

--begin

--select ProductName,ProductPrice,CategoryName from Product,Category

--where Product.CategoryID=Category.CategoryID 

--and Product.CategoryID=1

--end

--exec p_productinfo

--go

--练习 修改上面的存储过程,对商品价格进行排序 ,调用该存储过程

--alter proc p_productinfo

--as

--begin

--select ProductName,ProductPrice,CategoryName from Product,Category

--where Product.CategoryID=Category.CategoryID 

--and Product.CategoryID=1

--order by ProductPrice

--end

--exec p_productinfo

--go

--练习 删除存储过程

--drop proc p_productinfo

--go

--参数的本质是变量,在存储过程中声明参数(变量)不需要使用declare

--创建存储过程,查询指定性别的客户名称和性别

--create proc p_customerinfo2 

--@sex nvarchar(10)='男'--默认是输入参数

--as

--begin

--select * from Customer where Gender=@sex

--end

--执行存储过程

--exec p_customerinfo2 '女'

--go

--练习 创建存储过程,查询价格在指定区间内的商品的编号,名称和价格

--create proc p_productinfo3

--@num1 int,@num2 int

--as

--begin

--select ProductID,ProductName,ProductPrice from Product 

--where ProductPrice between @num1 and @num2

--end

--exec p_productinfo3  0,1000

--创建一个存储过程,

--完成商品表中指定类别下的商品的名称,价格,和类别名称

--go

--create proc p_productinfo4 

--@id int output --输出参数 向外界返回结果的

--as

--begin

--select @id=ProductID from Product 

--where ProductID=1

--end

--declare @rs int --声明一个变量来接收向外返回的output参数

--exec p_productinfo4 @rs output

--selec@rs

--案例1 创建存储过程,查询商品表中指定商品类别编号的商品的总库存,

--总价格,然后输出总库存和总价格

--go

--create proc p_info1 @cid int, --输入参数

--@totalstore int output, --输出参数

--@totalmoney decimal(18,2) output --输出参数

--as

--begin

--select @totalstore= sum(Store),@totalmoney= sum(ProductPrice)

--from Product where CategoryID=@cid

--end

--执行存储过程

--当执行带有输出参数的存储过程的时候

--(1)要声明和输出参数相同类型的变量来接收

--declare @rs int,@rs2 decimal(18,2)

--(2)在调用存储过程的时候,接收输出参数的变量后面需要加上关键字output

--exec p_info1 1,@rs output,@rs2 output

--select @rs,@rs2

--go

--案例2 创建存储过程,查询指定商品类别编号下的平均库存,

--然后查询指定商品编号的库存和平均库存做比较,

--如果该库存大于平均库存,则输出大于,如果等于平均库存则输出等于

--否则输出小于

--create proc p_msg@cid int ,@pid int,@msg nvarchar(20)output--输出参数

--as

--begin

--声明两个局部变量,分别来存储平均库存和指定商品下的库存

--declare @avgstore int,@store int

--1.求出执行类别编号下的平均库存

--select @avgstore= AVG(Store) from Product 

--where CategoryID=@cid

--2.查询指定商品编号的库存

--select @store= Store from Product 

--where ProductID=@pid

--3.判断指定商品编号的库存和平均库存的关系

--if @store>@avgstore  

--set @msg='大于'

--else if @store=@avgstore 

--set @msg='等于'

--else  

--set @msg='小于'

--end

--调用存储存储过程

--1.声明一个变量接收输出的参数

--declare @rs3 nvarchar(20)

--exec p_msg @cid=1,@pid=1,@msg=@rs3 output

--select @rs3

--go

--创建一个存储过程,然后判断两个数的大小,返回较大值

--create proc p_max 

--@num1 int,@num2 int

--as

--begin

--if @num1>@num2  

--return '较大值'+convert(nvarchar,@num1) --较大值4

--else 

--return '较小值'+convert(nvarchar,@num2)

--end

--调用带有返回值存储过程 先声明变量 然后 存储过程的结果赋值给变量

--declare @rs5 nvarchar(20)

--exec @rs5=p_max 4,2

--select @rs5

--存储过程中,通过return关键字,只能返回整数

--如果希望存储过程中向外界返回其他类型,则可以用输出参数output

--注意,rerun一次只能返回一个整数,如果需要一次返回多个,则也需要使用

--输出参数output