Sql server SQL Server 2005中CTE的作用域

Sql server SQL Server 2005中CTE的作用域,sql-server,Sql Server,这个很好用 如果相同的查询是这样写的 WITH emp_CTE AS ( SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS IdentityId, * FROM dbo.employee ) SELECT * FROM emp_CTE 它给出了一条消息,告知emp_CTE不存在 我们有没有办法克服这个问题 谢谢 普林斯简言之:不。CTE对下一个语句完全有效-不再有效。而且也没有办法延长CTE的寿命 发件人: 一个通用的表表达式CT

这个很好用

如果相同的查询是这样写的

WITH emp_CTE AS (
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS IdentityId, *
    FROM dbo.employee )
SELECT * FROM emp_CTE
它给出了一条消息,告知emp_CTE不存在

我们有没有办法克服这个问题

谢谢
普林斯

简言之:不。CTE对下一个语句完全有效-不再有效。而且也没有办法延长CTE的寿命

发件人:

一个通用的表表达式CTE可以被认为是一个临时表达式 在单个对象的执行范围内定义的结果集 选择、插入、更新、删除或创建视图语句。CTE是 与派生表类似,它不存储为对象,并且 仅在查询期间持续

你可以:

将您的CTE转换为一个视图,并将该视图用于您的查询-只要定义了视图,视图就可用

将CTE的结果存储到临时表或表变量中,以便进一步处理

在CTE之后更改语句,以便它们可以作为单个语句执行

WITH emp_CTE AS (
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS IdentityId, *
    FROM dbo.employee )
SELECT * FROM EMPLOYEES    
SELECT * FROM emp_CTE

CTE仅为后续声明的一部分

后续语句可以是单个SELECT/INSERT/UPDATE/DELETE语句,也可以是带有UNION、INTERSECT等的复合语句

例如:

WITH emp_CTE AS (
......)
SELECT (list of columns)
FROM emp_CTE
INNER JOIN dbo.Employees e ON ......
经验法则是,范围在下一步之前;是的。分号终止任何语句,但不幸的是它是可选的

上面的失败代码实际上是这样的

;WITH cte1 AS
(
   select ...
), cte2 AS
(
    select ...
)
SELECT ...
UNION 
SELECT ...;

因此,CTE的范围仅限于……员工

堆栈溢出的奇迹在于,我可以在当地时间晚上10点30分坐在这里,喝着啤酒,想知道为什么我的代码不工作,然后在几秒钟内找到我需要的东西。
...;
WITH emp_CTE AS (
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS IdentityId, *
    FROM dbo.employee )
SELECT * FROM EMPLOYEES; 
SELECT * FROM emp_CTE;