簡體   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