[英]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.