2010-04-22 2 views
1

나는 같은 SQL 문이있는 경우 :어쨌든 TOP을 사용할 때 @@ ROWCOUNT와 비슷한 값을 얻으려고합니까?

SELECT TOP 5 
* 
FROM Person 
WHERE Name LIKE 'Sm%' 
ORDER BY ID DESC 

PRINT @@ROWCOUNT 
-- shows '5' 

는 SANS 다시 쿼리를 다시 실행하지 않고 쿼리와 일치하는 모든 행의 실제 개수는 @@ROWCOUNT 같은 값을 얻을 수 어쨌든 있나요 TOP 5?

실제 문제는 TOP n 또는 SET ROWCOUNT n을 사용할 수 있기 때문에 훌륭하게 수행되는 훨씬 복잡하고 집중적 인 쿼리이지만 UI에 페이징 정보를 올바르게 표시하는 데 필요한 총 수를 얻을 수 없습니다. 현재 * 대신 @Count = COUNT(ID)으로 쿼리를 다시 발행해야합니다.

+0

비슷한 질문 : 1) http : // stackoverflow .com/questions/2200357/sql-return-limited-rows-but-full-row-count 2) http://stackoverflow.com/questions/610932/how-to-retrieve-the-total -row-count-of-a-query-with-top – JYelton

+0

사실, 누군가가 T-SQL에 특정한 흑 마법을 @@의 형태로 가질 수 있기를 바랬습니다. --- – cfeduke

답변

1

다른 COUNT() 쿼리를 실행해야합니다 : (총 횟수가 변수로 반환되지 않습니다 점에서)이 하다니

SELECT TOP 5 
* 
FROM Person 
WHERE Name LIKE 'Sm%' 
ORDER BY ID DESC 

DECLARE @r int 
SELECT 
@r=COUNT(*) 
FROM Person 
WHERE Name LIKE 'Sm%' 

select @r 
+0

그래, 이건 내가 피하려고하는거야. – cfeduke

+0

두 번째 쿼리가이를 수행하는 유일한 방법 인 것처럼 보입니다. 두 번째 쿼리의 ORDER BY를 제거하는 것도 좋은 방법입니다. – cfeduke

+0

예, 두 번째 주문에는 주문을하실 필요가 없습니다 –

2

정확하게 귀하의 요구 사항을 충족하지 않습니다, 그것은 할 수있다 하나의 명령문에서 수행 :

;WITH rowCTE 
AS 
(
SELECT * 
     ,ROW_NUMBER() OVER (ORDER BY ID DESC) AS rn1 
     ,ROW_NUMBER() OVER (ORDER BY ID ASC) AS rn2 
FROM Person 
WHERE Name LIKE 'Sm%' 
) 
SELECT * 
     ,(rn1 + rn2) - 1 as totalCount 
FROM rowCTE 
WHERE rn1 <=5 

totalCount 열이 곳 필터와 일치하는 행의 총 수있을 것이다.

괜찮은 크기의 데이터 세트에서 두 개의 쿼리에 대해 성능상으로 어떻게 쌓아 올지 흥미로운 점이 있습니다. 이 같은

+0

한번 시도해 보겠습니다. – cfeduke

1

뭔가를 할 수 있습니다

SELECT TOP 5 
* 
FROM Person 
cross join (select count(*) HowMany 
       from Person 
       WHERE Name LIKE 'Sm%') tot 
WHERE Name LIKE 'Sm%' 
ORDER BY ID DESC 

전체 수를 포함하는 하나의 열이있는 하위 쿼리가 반환 한 행; 교차 결합에는 "기본"쿼리에서 반환 된 모든 행이 포함되어 있고 SELECT *에는 새 행의 HowMany가 포함됩니다.

필요에 따라 다음 단계는 반환에서 해당 열을 필터링하는 것일 수 있습니다 한 가지 방법은 쿼리의 데이터를 임시 테이블에로드 한 다음 원하는 열만 반환하고 모든 행의 HowMany 열에서 행 개수를 가져 오는 것입니다.

관련 문제