我试图在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)