使用SQL Server 2005"WITH"语句的多个选择语句

Bri*_*hey 15 sql-server-2005

我试图在SQL Server 2005中使用"WITH"语句.如果我执行以下操作似乎工作正常:

WITH MyBigProducts AS (SELECT * FROM Products WHERE Size='Big')
SELECT Name FROM MyBigProducts
Run Code Online (Sandbox Code Playgroud)

但是如果我尝试使用多个select语句,它会失败,例如:

WITH MyBigProducts AS (SELECT * FROM Products WHERE Size='Big')
SELECT Name FROM MyBigProducts
SELECT Count(*) FROM MyBigProducts
Run Code Online (Sandbox Code Playgroud)

并且错误消息是"无效的对象名称'MyBigProducts'".

我可以做些什么来增加"MyBigProducts"表的范围以包含两个select语句吗?

我的例子是我的实际代码的简化导致问题,所以我不打算上述简单示例应该工作的可能性以及我的SQL中还有另一个错误.

我试过在两个SELECT语句周围包装一个BEGIN和END,但解析器无法编译它.

Kan*_*ane 14

我相信公用表表达式仅对立即使用有效,这就是"SELECT Count(*)FROM MyBigProducts"出现错误的原因.为了重用CTE,您应该使用临时表

DECALRE @BigProducts TABLE (...[declaration omitted]...)

INSERT INTO @BigProducts
SELECT * 
FROM Products 
WHERE Size='Big'


SELECT Name FROM @BigProducts
SELECT Count(*) FROM @BigProducts
Run Code Online (Sandbox Code Playgroud)

如果我错了,请纠正我.


Tom*_*m H 14

正如Kane所说,CTE仅在编写它的SQL语句中可用.根据您的具体情况,另一种可能的解决方案是在单个查询中包含COUNT(*):

;WITH MyBigProducts AS
(
     SELECT
          Name,
          COUNT(*) OVER () AS total_count
     FROM
          Products
     WHERE
          Size = 'Big'
)
SELECT
     Name,
     total_count
FROM
     MyBigProducts
Run Code Online (Sandbox Code Playgroud)