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;