我今天在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语句会运行,第一个。无论哪个是哪个,只有第一个运行。我认为这是某种语法,我可能会错过吗?我收到错误“无效的对象名称'temp2'”。
有人能解释一下这个问题吗?有没有解决方法呢?
答案 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)
如果您不想明确重复查询,请使用视图或用户定义的表值函数来存储您的查询。