存储过程和函数一样也可以递归调用,调用方法类似。如下是求某个数以内的数字求和:
CREATE PROCEDURE aProc_Test
@INPUT int,
@Sum int output
AS
BEGIN
SET NOCOUNT ON;
if(@Sum is null)
set @Sum=0
if(@INPUT>0)
begin
set @INPUT=@INPUT-1
set @Sum=@Sum+@INPUT
EXEC aProc_Test @INPUT,@Sum output
end
END
GO
--调用存储过程,对1~10的数字求和
DECLARE @OUT int,@output int
EXEC aProc_Test 11,@output output
SELECT [OUTPUT值]=@output
go
输出结果:
注意:递归存储过程一般会用到 output 或 return,两者返回值类型上有一定的区别,output 基本上没有限制,但 return 返回的一般是 int 类型。
下面是审核流中根据某一个节点查询下一个节点,就是用的 return 实现
CREATE PROCEDURE [dbo].[up_Flow_JudegNextStep]
@StepId int,
@FRId int,
@PosId int
AS
BEGIN
SET NOCOUNT ON;
declare @SRId int;
select @SRId = SRId from FL_FlowStep where StepId = @StepId;
--插入当前步骤
exec up_Flow_AddPath @FRId = @FRId, @StepId = @StepId, @SRId = @SRId, @ObjId = @PosId;
--处理分支
declare judgeCursor Cursor For
select FLDField,Operator,Value,NextStep from FL_FlowStepJudge a left join FL_FlowFormField b
on a.FLDId = b.FLDId where StepId = @StepId;
open judgeCursor;
declare @field varchar(10),@Operator varchar(10),@value varchar(10), @next int;
fetch next from judgeCursor into @field,@Operator,@value,@next;
while(@@FETCH_STATUS=0)
begin
declare @sql nvarchar(100);
declare @has int;
set @sql = 'select @a = count(1) from FL_FlowData where FRId='+CAST(@FRId as varchar(10))+' and '+@field+@Operator+''''+@value+'''';
exec sp_executesql @sql,N'@a int output',@has output;
if @has > 0
begin
close judgeCursor;
deallocate judgeCursor;
if @next > 0
begin
exec up_Flow_JudegNextStep @StepId=@next,@FRId=@FRId,@PosId=@PosId;
end
return 1;
end
fetch next from judgeCursor into @field,@Operator,@value,@next;
end
close judgeCursor;
deallocate judgeCursor;
return 0;
--处理分支结束
END
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。