表结构
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