跳至侧栏

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

表结构

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
posted @ 2018-12-07 11:20  Candyメ奶糖  阅读(476)  评论(0编辑  收藏  举报