繁体   English   中英

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

[英]creating a temp table from a “with table as” CTE 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)

WITH子句引入的一组CTE对遵循最后一个CTE定义单个语句有效。 在这里,看来您应该只跳过简单的SELECT并使INSERT以下语句:

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

(我已经从#TMP添加了select ,因此我们仍然可以将结果集返回给客户端,尽管insertselect语句现在都已反转)。

您可以一对一地使用2条CTE语句,CTE将在声明后立即运行。 查看CTE规则

因此, SELECT * from abcd;删除SELECT * from abcd; 在此之前, insert into #TMP (id,parent,branch,depth) (select * from abcd)

对于递归CTE: 何时使用通用表表达式(CTE)

由于CTE不存在,因此只能使用一次,例如

WITH cte(id) AS 
(
SELECT 1
)

SELECT * FROM cte;

SELECT * FROM cte;

将为第一个调用返回结果“ 1”,但随后出现错误

消息208,级别16,状态1,第8行无效的对象名称'cte'。

在第二。

您需要删除

SELECT * from abcd;

在填充临时表之前,或者如果需要两次调用它,请使用持久化方法(临时表,表变量等)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM