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

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

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

Ответы [ 7 ]

18 голосов
/ 12 декабря 2013

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

select COUNT(*) OVER () as Total_Rows, ... from ...
13 голосов
/ 12 мая 2010

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

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

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

3 голосов
/ 12 мая 2010

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

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

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

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

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

2 голосов
/ 12 мая 2010

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

select 
    *, 
    TotalVolume = (select COUNT(*) from HumanResources.Department) 
from  HumanResources.Department
1 голос
/ 12 мая 2010

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

0 голосов
/ 12 мая 2010
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 голосов
/ 12 мая 2010
select *, @@rowcount from MyTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...