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


    表结构

    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
    
  • 相关阅读:
    string类的方法
    引用
    面向对象之多态性(基类引用可以指向子类)
    SQL Server、Oracle数据库排序空值null问题解决办法(转)
    远程计算机已结束连接解决方法
    GUID自增ID表关联比较
    第四种行转列
    SQL简体转繁体互换(常用汉字词组)
    CSS基本布局16例
    Dojo Javascript 编程规范
  • 原文地址:https://www.cnblogs.com/Candies/p/10081860.html
Copyright © 2020-2023  润新知