2014-02-09 37 views
2

使用SQL Server 2008时,我使用公用表表达式来选择与给定条件匹配的属性(别墅)列表,然后给出行号并选择特定“页面”行号。它运行良好,但我也想返回总行数(即忽略后续分页)。 CTE似乎只有在声明后才有一次使用。我曾尝试做以下(超级简化版);SQL Server CTE选择并返回值

WITH results AS (
    SELECT property.* FROM property 
) 

SELECT * FROM results 

RETURN SELECT COUNT(results.id) 

但它失去了对'结果'和错误的引用;

无法绑定多部分标识符“results.id”。

有没有一种有效的方式来做到这一点,不涉及双重查询?

为了澄清,我想同时选择行,并且还返回外部行的总数。但主要是我在第一次使用后似乎不存在CTE的路障。

为了帮助展示M.Ali在全面解决方案中的目标;

DECLARE @pageSize int; 
DECLARE @pageNumber int; 
DECLARE @totalResults int; 

SET @pageSize = 30; 
SET @pageNumber = 1; 

;WITH results AS (
    SELECT property.* 
    FROM property 
), 

/* add the row number based on sorting */ 
/* this is where I need to store into @totalResults, but I can't break the CTE chain */ 

weightedResults AS (
    SELECT 
     *, 
     ROW_NUMBER() OVER(ORDER BY results.id) AS rowNum 

    FROM 
     results 
) 

/* do the paged select */ 
SELECT * FROM weightedResults 
WHERE (rowNum > @pageSize * (@pageNumber-1)) AND (rowNum <= (@pageSize * (@pageNumber-1)) + @pageSize) 
ORDER BY rowNum 

看到我的状态,我需要收集总行的评论 - 这是我需要总行从“结果”存储点,但如果我在这一点上选择然后我消耗的CTE 。我可以让CTE更持久吗?

回答

2
;WITH results 
AS (

    SELECT property.* FROM property 
) 
    SELECT COUNT(*) FROM results 

OR

只需使用@@ ROWCOUNT函数来获取行的总数返回是否已执行了你select语句后。

/* Your Select Statement here */ 

SELECT @@ROWCOUNT; 
+0

我想选择行,并返回外部计数作为总数。 – Grenville

+0

@Grenville是的,我的第二个建议是这样做的,先执行你的select语句然后SELECT @@ ROWCOUNT。 –

+0

谢谢,但我已更新我的问题,以说明为什么我认为我无法做到这一点。 – Grenville