T-SQL递归查询-数据沿袭

T-SQL递归查询-数据沿袭,sql,tsql,recursive-query,Sql,Tsql,Recursive Query,给出下表 我需要获得数据库对象的“数据沿袭” 预期输出(类似于此): 这是我试过的剧本 CREATE TABLE #smth ( ParObj NVARCHAR(200) ,ChilObj NVARCHAR(200) ); INSERT INTO #smth ( ParObj ,ChilObj ) VALUES ( N'FactSales', N'qryFactSales' ) ,( 'qryFac

给出下表

我需要获得数据库对象的“数据沿袭”

预期输出(类似于此):

这是我试过的剧本

CREATE TABLE #smth
     (
         ParObj   NVARCHAR(200)
         ,ChilObj NVARCHAR(200)
     );


INSERT INTO #smth (
    ParObj
    ,ChilObj
)
VALUES ( N'FactSales', N'qryFactSales' )
       ,( 'qryFactSales', 'qryFactSalesOnlineUnited' );

WITH cte
    AS (
           SELECT ParObj
                  ,ChilObj
                  ,level = 1
                  ,path = CAST('root' AS VARCHAR(100))
           FROM   #smth
           UNION ALL
           SELECT t2.ParObj
                  ,t2.ChilObj
                  ,level = t1.level + 1
                  ,Path = CAST(t1.path + ' ||| ' + CAST(t2.ChilObj AS VARCHAR(100)) AS VARCHAR(100))
           FROM   #smth AS t2
                  JOIN cte AS t1
                      ON t1.ChilObj = t2.ParObj
       )
SELECT   *
FROM     cte
ORDER BY cte.path;

甚至可以实现吗?

此版本满足您的要求:

with cte as (
      select parobj as obj, convert(nvarchar(max), NULL) as path
      from smth
      where not exists (select 1 from smth smth2 where smth2.chilobj = smth.parobj)
      union all
      select smth.chilobj as obj, convert(nvarchar(max), coalesce(path + ' -> ', '')) + cte.obj
      from cte join
           smth
           on cte.obj = smth.parobj
     )
select obj, coalesce(path + ' -> ' + obj, 'Root')
from cte;

是一个数字小提琴。

如果路径相反,您介意分享一个调整吗?因此,qryFactSalesOnlineUnited->qryFactSales->FactSales成为最后一行的FactSales->qryfactsaless->qryFactSalesOnlineUnited(其中obj=FactSales)@Dnac。在递归子查询的第二部分,我将颠倒连接的顺序。如果这不起作用,那么再问另一个问题。