* 建立存储过程的语法
CREATE PROCedure[owner.]procedurename[;number]
[[(]@parameter_name datatype[=default][OUTput]
[,@parameter_name datatype[=default][OUTput]]...[)]]
[WITH RECOMPILE]
AS SQL_statements
* 调用存储过程的语法
[EXECute][@return-status=]
[[[server.]database.]owner.]procedurename[;number]
[[@parameter_name=]value|[@parameter_name=]@varialbe[OUTput]
[,[@parameter_name=]value|[@parameter_name=]@variable[OUTput]...]]
[WITH RECOMPILE]
* 例子
例1:建立存储过程p_RsGz_JiNeng,它有一个输入参数c_GeRenId,类型是char(4)
create procedure p_RsGz_JiNeng @c_GeRenId char(4)
as
select *from RS_LS_GZ_JiNeng
where GeRen_id=@c_GeRenId
order by RiQi
调用p_RsGz_JiNeng:
declare @GeRenId char(4)
select @GeRenId="0135" /*设要查询员工的个人代码为"0135" */
execute p_RsGz_JeNeng @c_GeRenId=@GeRenId
上面的代码有几个地方值得注意:
1)声明一个变量的方式: declare @variable_name type
2) 给变量赋值: select @variable_name=value。在使用变量时要在其名称前加@。
3) 调用存储过程时给输入参数赋值:execute procedure @input_para=@variable
例2:建立有输出参数的存储过程p_RsGz_JiNeng_Slt
create procedure p_RsGz_JiNeng_Slt
(@c_GeRenId char(4), @sm_JinE smallmoney output)
as
select @sm_JinE=JinE
from RS_LS_GZ_JiNeng
where RiQi=(select max(RiQi)
from RS_LS_GZ_JiNeng
where GeRenid=@c-GeRenId)/*找出历史记录中距离当前最近的日期*/
在定义存储过程时,对输出参数的output修饰不可或缺。在sql代码中,无需用类似return这样的语句来使参数返回。
调用存储过程p_RsGz_JiNeng_Slt:
declare @GeRenId char(4),@JinE smallmoney
select @GeRenid="0135"/*设要查询员工的个人代码为"0135"*/
select @JinE=0
execute p_RsGz_JiNeng_slt @c_GeRenId=@GeRenId,@sm_JinE=@ JinE output
调用存储过程的代码中,output不可省略。
例3:查不到数据则返回错误代码
create procedure p_RsGz_JiNeng_Rtn
@c_GeRenId char(4)
as
declare @ErrCode smallint
select @ErrCode=0
if exists(select* from RS-LS-GZ-JiNeng
where GeRenid=@c-GeRenId)
begin
select * from RS_LS_GZ_JiNeng
where GeRen_id=@c_GeRenId
order by RiQi
return @ErrCode
end
else
begin
select @ErrCode=1
return @ErrCode
end
调用存储过程p_RsGz_JiNeng_Rtn:
declare @GeRenId char(4),@RtnCode smallint
select @GeRenId="0135"
select @RtnCode=0
execute @RtnCode=p_RsGz_JiNeng_Rtn @c_GeRenId=@GeRenId
if @RtnCode=1
print"No this one!"