从“with table as”CTE 表达式创建临时表

Hig*_*wer 3 sql sql-server common-table-expression

我似乎无法根据 CTE 表达式的结果访问临时表。

如何创建临时表并访问 CTE 中声明的临时表。

在下面的示例中,最后一行将引发错误。

谢谢

 DECLARE @tbl TABLE
  ( 
   Id int
  ,ParentId int
  )
INSERT  INTO @tbl
        ( Id, ParentId )
select t_package.package_id, t_package.parent_ID from t_package 
;
WITH  abcd
        AS (
              -- anchor
            SELECT   id
                    ,ParentID
                    ,CAST(id AS VARCHAR(100)) AS [Path]
                    ,0 as depth
            FROM    @tbl
            WHERE   ParentId = 0
            UNION ALL
              --recursive member
            SELECT  t.id
                   ,t.ParentID
                   ,CAST(a.[Path] + ',' + CAST( t.ID AS VARCHAR(100)) AS varchar(100)) AS [Path]
                   ,a.depth +1
            FROM    @tbl AS t
                    JOIN abcd AS a ON t.ParentId = a.id
           )
SELECT * from abcd;

insert into #TMP (id,parent,branch,depth) (select * from abcd)
Run Code Online (Sandbox Code Playgroud)

Dam*_*ver 5

子句引入的一组 CTE对于最后一个 CTE 定义后面的单个语句有效WITH。在这里,看来你应该跳过裸露部分并做出以下声明:SELECTINSERT

WITH  abcd
        AS (
              -- anchor
            SELECT   id
                    ,ParentID
                    ,CAST(id AS VARCHAR(100)) AS [Path]
                    ,0 as depth
            FROM    @tbl
            WHERE   ParentId = 0
            UNION ALL
              --recursive member
            SELECT  t.id
                   ,t.ParentID
                   ,CAST(a.[Path] + ',' + CAST( t.ID AS VARCHAR(100)) AS varchar(100)) AS [Path]
                   ,a.depth +1
            FROM    @tbl AS t
                    JOIN abcd AS a ON t.ParentId = a.id
           )
insert into #TMP (id,parent,branch,depth) select * from abcd

select * from #TMP
Run Code Online (Sandbox Code Playgroud)

(我添加了selectfrom,#TMP以便我们仍然获得返回给客户端的结果集,尽管insertselect语句现在已颠倒)。