[原创]存储过程里面的递归

表结构
CREATE TABLE #temptable
    (
      [id] BIGINT ,
      [dataKey] NVARCHAR(255) ,
      [dataValue] NVARCHAR(MAX) ,
      [displayOrder] INT ,
      [dataTypeDesc] NVARCHAR(100) ,
      [pid] BIGINT ,
      [Remark] NVARCHAR(256)
    );
测试数据

INSERT INTO #temptable
VALUES
( 1, N'10', N'代付款', 0, N'billStatus', 0, N'账单状态' ), 
( 2, N'20', N'付款中', 0, N'billStatus', 1, N'账单状态' ), 
( 3, N'30', N'待确认', 0, N'billStatus', 2, N'账单状态' ), 
( 4, N'40', N'已付款', 0, N'billStatus', 3, N'账单状态' ), 
( 5, N'50', N'逾期', 0, N'billStatus', 4, N'账单状态' ), 
( 6, N'10', N'任务补充费用', 0, N'supplementFeeType', 0, N'费用类型' ), 
( 7, N'20', N'服务违规罚款', 0, N'supplementFeeType', 6, N'费用类型' ), 
( 8, N'30', N'优质服务奖励', 0, N'supplementFeeType', 7, N'费用类型' ), 
( 9, N'1', N'个人支付', 0, N'paySource', 0, N'支付方式' ), 
( 10, N'2', N'企业支付', 0, N'paySource', 9, N'支付方式' )
存储过程
# 测试参数
DECLARE @DataTypeDesc NVARCHAR(MAX) = 'billStatus,contractType';
  DROP TABLE IF EXISTS #DataType_tmp;
  DROP TABLE IF EXISTS #Temp;

CREATE TABLE #DataType_tmp
    (
      dataTypeDesc NVARCHAR(100)
    );
INSERT  INTO #DataType_tmp
        SELECT DISTINCT
                value
        FROM    STRING_SPLIT(@DataTypeDesc, ',');

CREATE TABLE #Temp ( id BIGINT, pid BIGINT );


    IF EXISTS(SELECT 1 FROM #DataType_tmp)
    BEGIN

    -- 递归的精髓所在
     WITH Cte
    AS (
SELECT [id]
      ,[pid]
  FROM [#temptable] p
  JOIN #DataType_tmp tmp ON p.dataTypeDesc =  tmp.dataTypeDesc
  WHERE p.pid = 0

    UNION ALL
        SELECT  T.[id]
      ,T.[pid]
        FROM Cte
            INNER JOIN [#temptable] T
                ON T.pid = Cte.id

  )
  INSERT INTO #Temp
  (id, pid)
  SELECT id, pid FROM Cte

  SELECT te.* FROM #Temp t JOIN [#temptable] te ON t.id = te.id;
  
  DROP TABLE #DataType_tmp;
  DROP TABLE #Temp;
  END

转载于:https://www.cnblogs.com/Candies/p/10081860.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值