Как включить общее количество возвращенных строк в набор результатов с помощью команды 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

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

19
задан quarkX 12 May 2010 в 18:11
поделиться

6 ответов

Из комментариев, приложенных к вопросу, ясно, что этот вопрос относится к пейджингу. В этом сценарии есть два широких подхода:

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

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

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

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

3
ответ дан 30 November 2019 в 03:43
поделиться

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

select 
    *, 
    TotalVolume = (select COUNT(*) from HumanResources.Department) 
from  HumanResources.Department
2
ответ дан 30 November 2019 в 03:43
поделиться

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

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

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

13
ответ дан 30 November 2019 в 03:43
поделиться

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

1
ответ дан 30 November 2019 в 03:43
поделиться
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
0
ответ дан 30 November 2019 в 03:43
поделиться
select *, @@rowcount from MyTable
-3
ответ дан 30 November 2019 в 03:43
поделиться