我有这个,但在设置总数时出现错误。 为什么我无法多次访问 cte?
ALTER PROCEDURE [dbo].[GetLeaguePlayers]
(
@idleague int,
@pageNumber int,
@pageSize int,
@total int OUTPUT
)
AS
WITH CTEPlayers AS
(
SELECT ROW_NUMBER() OVER (ORDER BY p.Name) AS RowNumber, p.Id, p.Name, t.Name AS Team
FROM Players p INNER JOIN Teams t ON p.IdTeam=t.Id INNER JOIN Leagues l ON l.Id=t.IdLeague
WHERE l.Id=@idleague
)
SELECT Id, Name
FROM CTEPlayers c
WHERE RowNumber>@pageSize*(@pageNumber-1) AND RowNumber<@pageSize*@pageNumber;
SET @total = ( SELECT COUNT(*) FROM CTEPlayers )
最佳答案
CTE
基本上是一次性 View 。它仅持续一条语句,然后自动消失。
您的选择包括:
再次重新定义
CTE
。这就像从WITH...
复制粘贴到定义末尾到SET
之前一样简单。将结果放入
#temp
表或@table
变量将结果具体化为真实表格并引用
稍微更改为仅从 CTE 中选择
SELECT COUNT
:
.
SELECT @total = COUNT(*)
FROM Players p
INNER JOIN Teams t
ON p.IdTeam=t.Id
INNER JOIN Leagues l
ON l.Id=t.IdLeague
WHERE l.Id=@idleague
关于sql - 多次使用一个 CTE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10196808/