不能从多个公用表表达式(WITH)多次查询?

时间:2012-03-16 19:55:46

标签: sql sql-server-2008 tsql common-table-expression

我今天在T-SQL,SQL-Server-2008中进行了一些查询,并偶然发现了一些我不理解的奇怪内容。使用查询窗口,我试图从两个常见的表格表达式查询(我删除了很多代码,使其更明显我在做什么):

;WITH temp1 AS (SELECT * FROM dbo.Log)
, temp2 AS (SELECT  * FROM dbo.SignalCodeItems300_tbl)

SELECT * FROM temp1
SELECT * FROM temp2

但是,只有一个select语句会运行,第一个。无论哪个是哪个,只有第一个运行。我认为这是某种语法,我可能会错过吗?我收到错误“无效的对象名称't​​emp2'”。

有人能解释一下这个问题吗?有没有解决方法呢?

3 个答案:

答案 0 :(得分:1)

不,这可行。 CTE(公用表表达式)仅适用于定义后的第一个语句。换句话说,在select * from temp1之后,它们都变得不可用。

修复将是这样的:

;WITH temp1 AS (SELECT * FROM dbo.Log)
SELECT * FROM temp1

;WITH temp2 AS (SELECT  * FROM dbo.SignalCodeItems300_tbl)
SELECT * FROM temp2

答案 1 :(得分:1)

您可能需要查看MSDN documentation

特别是:

Multiple CTE query definitions can be defined in a nonrecursive CTE. 
The definitions must be combined by one of these set operators:
UNION ALL, UNION, INTERSECT, or EXCEPT.

您不能混合和匹配两个不同的模式,因为它基本上作为一个查询运行。

答案 2 :(得分:0)

如果您不想明确重复查询,请使用视图或用户定义的表值函数来存储您的查询。