В любом случае, чтобы получить значение, подобное @@ ROWCOUNT, когда используется TOP? - PullRequest
1 голос
/ 22 апреля 2010

Если у меня есть оператор SQL, например:

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

PRINT @@ROWCOUNT
-- shows '5'

Можно ли в любом случае получить значение типа @@ROWCOUNT, которое является фактическим числом всех строк, соответствующих запросу, без повторной выдачи запроса без TOP 5?

Фактическая проблема - гораздо более сложный и интенсивный запрос, который прекрасно работает, поскольку мы можем использовать TOP n или SET ROWCOUNT n, но тогда мы не сможем получить общее количество, необходимое для правильного отображения информации о подкачке в пользовательском интерфейсе. В настоящее время мы должны повторно выполнить запрос с @Count = COUNT(ID) вместо *.

Ответы [ 3 ]

2 голосов
/ 22 апреля 2010

Хотя это не совсем соответствует вашим требованиям (в том смысле, что общее количество не возвращается как переменная), это можно сделать одним оператором:

;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 будет указано общее количество строк, соответствующих фильтру where.

Было бы интересно посмотреть, как это складывается с точки зрения производительности в сравнении с двумя запросами в наборе данных приличного размера.

1 голос
/ 22 апреля 2010

Что-то вроде этого может сделать это:

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 из любой строки.

1 голос
/ 22 апреля 2010

вам нужно будет выполнить другой запрос 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...