Как включить общее количество возвращенных строк в наборе результатов из команды SELECT T-SQL?

Я хотел бы спросить, есть ли способ включить общее количество строк в качестве дополнительного столбца в возвращаемых наборах результатов из запроса TSQL, используя также команду Row_Number (SQL 2005). Например, получение результатов, заданных из запроса в таблице Book, в форме, подобной этой:

RowNum   BookId     BookTitle    TotalRows
--------------------------------------------
1        1056       Title1       5    
2        1467       Title2       5    
3        121        Title3       5    
4        1789       Title4       5    
5        789        Title5       5

Запрос является частью пользовательских функций подкачки, реализованных в хранимой процедуре. Цель состоит в том, чтобы вернуть только записи для текущей страницы Index и ограничить размер страницы, а также количество общего количества записей в инструкции select, чтобы определить общее количество страниц с результатами.

Ответы

Ответ 1

В SQL Server 2008 и более поздних версиях добавьте COUNT (*) OVER() как одно из имен столбцов в вашем запросе и которое будет заполнено итоговыми возвращаемыми строками. Он повторяется в каждой строке, но, по крайней мере, значение доступно. Причина, по которой многие другие решения не работают, заключается в том, что для очень больших наборов результатов вы не будете знать общую сумму до тех пор, пока не повторите все строки, которые во многих случаях не практичны (особенно последовательные решения для обработки). Этот метод дает вам общее количество после вызова первого IDataReader.Read(), например.

select COUNT(*) OVER () as Total_Rows, ... from ...

Ответ 2

В SQL Server 2005 и новее вы можете сделать это с помощью CTE:

WITH result AS (SELECT ... your query here ...)
SELECT
    *,
    (SELECT COUNT(*) FROM result) AS TotalRows
FROM result

В общем, я бы посоветовал не делать этого, но если вам действительно нужно, то вот как это сделать.

Ответ 3

Через комментарии, связанные с вопросом, ясно, что этот вопрос относится к поисковому вызову. В этом сценарии существуют два широких подхода:

  • Запросить все строки, соответствующие критериям поиска (не только на одну страницу), и сохранить в переменной таблицы (наряду с ROW_NUMBER). Затем запустите два запроса против этой переменной таблицы: один для извлечения желаемой страницы данных, а второй для получения общего счета.
  • Не используйте переменную таблицы и просто дважды выполняйте полный запрос, один раз, чтобы получить страницу данных и один раз для общего количества.

Первый вариант работает хорошо, если общее количество строк измеряется тысячами. Если общее число намного выше, лучше всего выполнить запрос дважды.

Это типичный компромисс между пространством/обработкой.

Ваше бедствие может варьироваться - то, что хорошо работает для одной ситуации, может быть ужасным в другом!

Ответ 4

Пример использования базы данных AdventureWorks

select 
    *, 
    TotalVolume = (select COUNT(*) from HumanResources.Department) 
from  HumanResources.Department

Ответ 5

Возможно, вы ищете @@ROWCOUNT?

Ответ 6

SELECT  n ,
        COUNT(*) OVER ( PARTITION BY 1 )
FROM    ( SELECT    1 AS n
          UNION ALL
          SELECT    2 AS n
        ) AS t

Обратите внимание, что @@ROWCOUNT дает вам количество строк из предыдущей команды. Запустите это:

SELECT    1 AS n;

SELECT  n ,
        @@ROWCOUNT
FROM    ( SELECT    1 AS n
          UNION ALL
          SELECT    2 AS n
        ) AS t

Ответ 7

select *, @@rowcount from MyTable