2014-02-09 1 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"를 바인딩 할 수 없습니다.

이중 쿼리를 포함하지 않는 효율적인 방법이 있습니까?

분명히하기 위해 행을 선택하고 또한 외부 행의 총 수를 반환합니다. 그러나 주로 1 차 사용 후 겉으로보기에는 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 

또는

은 단순히 당신이 당신에게 선택 문을 실행 한 후에 행의 총 수를 반환받을 @@ ROWCOUNT 함수를 사용합니다.

/* Your Select Statement here */ 

SELECT @@ROWCOUNT; 
+0

행을 선택하고 합계로 외부 수를 반환하고 싶습니다. – Grenville

+0

@ 그렌 빌 예 두 번째 제안은 SELECT 문을 먼저 실행 한 다음 SELECT @@ ROWCOUNT를 실행합니다. –

+0

고마워요,하지만 제가 왜 그럴 수 없다고 생각하는지 보여주기 위해 제 질문을 업데이트했습니다. – Grenville