【问题标题】:Call stored procedure into recursion cte调用存储过程到递归cte
【发布时间】:2014-05-14 09:01:23
【问题描述】:

我有下表

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 和上面的查询,以便开始从最低的子级递归更新到高级(根)?

【问题讨论】:

    标签: sql sql-server recursive-cte


    【解决方案1】:

    您可以将排序结果插入#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
    

    【讨论】:

    • 你知道如何将每次执行 Exec [spGetResultstarting] pnlId, pnlParentId 得到的数据插入到表中吗?
    猜你喜欢
    • 2011-03-18
    • 2021-04-13
    • 2011-09-14
    • 2015-08-08
    • 1970-01-01
    • 2011-03-27
    • 2016-02-18
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多