表结构
CREATE TABLE #temptable ( [id] BIGINT , [dataKey] NVARCHAR(255) , [dataValue] NVARCHAR(MAX) , [displayOrder] INT , [dataTypeDesc] NVARCHAR(100) , [pid] BIGINT , [Remark] NVARCHAR(256) );
测试数据
INSERT INTO #temptableVALUES( 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