[英]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
,因此我們仍然可以將結果集返回給客戶端,盡管insert
和select
語句現在都已反轉)。
您可以一對一地使用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.