SQL存储过程的递归调用

论坛 期权论坛 脚本     
匿名技术用户   2020-12-30 06:23   618   0

存储过程和函数一样也可以递归调用,调用方法类似。如下是求某个数以内的数字求和:

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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP