我有下表
PNLTable([PnlId],
[Line],
[TotalisationId],
[Designation],
[Totalisation],
ParentId).
我使用以下查询来获取每个pnlid所有子项
;WITH CTE
AS
(
SELECT PNLId ,concat('/',cast(PNLId as nvarchar(MAX)) )as tree, PNLParentId
FROM [dbo].[DimPNL]
WHERE PNLParentId IS NULL
UNION ALL
SELECT T1.PNLId,concat( CTE.tree ,'/',cast(t1.PNLId as nvarchar(MAX))), T1.PNLParentId
FROM [dbo].[DimPNL] AS T1
INNER JOIN CTE
ON T1.PNLParentId = CTE.PNLId
)
SELECT *
FROM CTE
我使用了存储过程spGetResult,它通过一些约束来更新Totalisation。
如何在spGetResultstarting
和上面的查询之间进行组合,以便从最低级别的子级(根级)递归地开始更新?
答案 0 :(得分:0)
您只需将已排序的结果插入到#temp
表中,然后使用cursor迭代结果,如下所示:
;WITH CTE
AS
(
SELECT PNLId ,concat('/',cast(PNLId as nvarchar(MAX)) )as tree, PNLParentId
FROM [dbo].[DimPNL]
WHERE PNLParentId IS NULL
UNION ALL
SELECT T1.PNLId,concat( CTE.tree ,'/',cast(t1.PNLId as nvarchar(MAX))), T1.PNLParentId
FROM [dbo].[DimPNL] AS T1
INNER JOIN CTE
ON T1.PNLParentId = CTE.PNLId
)
-- order the results into a #temp table
SELECT *
INTO #temp
FROM CTE
ORDER BY PNLId, PNLParentId DESC -- set this accordingly
DECLARE @pnlId int
DECLARE @pnlParentId int
DECLARE db_cursor CURSOR FOR
SELECT PNLId, PNLParentId
FROM #temp
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @pnlId, @pnlParentId
WHILE @@FETCH_STATUS = 0
BEGIN
-- call ytour stored proc with required params here
Exec [spGetResultstarting] @pnlId, @pnlParentId
FETCH NEXT FROM db_cursor INTO @pnlId, @pnlParentId
END
CLOSE db_cursor
DEALLOCATE db_cursor