0

私は次の表を持っています

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

いくつかの制約で Totalisation を更新するストアド プロシージャ spGetResult を使用しました。

spGetResultstarting最下位の子から上位 (ルート) への再帰的な更新を開始するために、上記のクエリをどのように組み合わせることができますか?

4

1 に答える 1

0

#temp順序付けされた結果をテーブルに挿入し、カーソルを使用して結果を次のように反復処理できます。

;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
于 2014-05-14T10:02:14.460 に答える