2012-03-16 69 views
2

我今天在T-SQL,SQL-Server-2008上做了一些查询,偶然发现了一些我不明白的奇怪东西。使用查询窗口,我想从像这样两个共同的表表达式查询(我去掉了大量的代码,使之更加明显我在做什么):不能从多个通用表格表达式(WITH)多次查询?

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

SELECT * FROM temp1 
SELECT * FROM temp2 

然而,只有选择之一声明将运行,第一个。不管哪个是哪个,只有第一个运行。我认为这是某种我可能缺少的语法的东西?我收到错误“无效的对象名称't​​emp2'”。

有人可以解释一下这个问题吗?有没有解决这个问题的方法?

回答

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

你可能想看看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. 

您不能混用,虽然搭配两种不同的模式,因为这基本上是运行作为一个查询。

0

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