2013-11-27 3 views
0

Я показываю данные на странице, содержащей 15 строк на странице. Я использую OFFSET & FETCH ключевых слов SQL Server 2012, чтобы ограничить 15 строк, которые я хочу. Тем не менее, я хочу отобразить TOTAL количество доступных строк, как это сделать в одном запросе?Лучший способ получить общее количество записей с использованием SQL-запроса во время подкачки данных

Например, в верхней части страницы вы видите 15 из 1505 записей.

Есть ли способ объединить это с моим существующим запросом?

+0

Я решил этот конкретный сценарий с помощью SQLDataReader и запросил две отдельные таблицы. Одна таблица для 15 записей, затем другой запрос с использованием функции Count() для вызова общих записей. – Pearce

ответ

0

Вы можете использовать COUNT():

SELECT COUNT(*) FROM Table 
WHERE conditionHere 

А потом на количество страниц, вы должны сделать это на вашем языке программирования выбора, будь то php или asp.net, например.

И в основном вычисления выглядит следующим образом:

PageNumber * RecordsPerPage 

Допустим, номер страницы 2 с 15 Записи на странице будет:

2 * 15 

Таким образом, ваш выход будет

30 of NumberOfRecords 

Вы можете сосчитать, кстати, страницы, используя формулу

TotalPages = CEILING(TotalRecords/RecordsPerPages) 

Например, используя свои собственные данные, было бы:

TotalPages = CEILING(1,505/15) 

Что 101 если вы получаете значение потолка.

Если Php это, вероятно, выглядеть следующим образом:

$TotalPages = Ceil($NumberOfRecords/$RecordsPerPages) 

Если ASP с помощью C# было бы, вероятно, выглядеть следующим образом:

int TotalPages = Math.Ceil(NumberOfRecords/RecordsPerPages); 

Однако, если они облизывают последнюю страницу щелкают, то вы можно было бы просто положить:

TotalRecords of TotalRecords 

Например:

1,505 of 1,505 
4

Как и другие показали, что вы можете сделать это, но вместо того, чтобы использовать COUNT как они демонстрируют, что я собираюсь использовать систему metatdata, которая чертовски много быстрее. Физически вызов SELECT COUNT(1) AS rc FROM MyTable заставит механизм хранения перечислить все данные, которые могут быть или не быть в памяти, чтобы выполнять подсчет и ждать разблокировки любых эксклюзивных замков.

Вы знаете, что более эффективно? Просто посмотрите на sys.allocation_units.

SELECT 
    s.[Name] as [Schema] 
, t.[name] as [Table] 
, SUM(p.rows) as [RowCount] 
FROM 
    sys.schemas s 
    LEFT OUTER JOIN 
     sys.tables t 
     ON s.schema_id = t.schema_id 
    LEFT OUTER JOIN 
     sys.partitions p 
     ON t.object_id = p.object_id 
    LEFT OUTER JOIN 
     sys.allocation_units a 
     ON p.partition_id = a.container_id 
WHERE 
    p.index_id in(0,1) -- 0 heap table , 1 table with clustered index 
    AND p.rows is not null 
    AND a.type = 1 -- row-data only , not LOB 
GROUP BY 
    s.[Name] 
, t.[name] 
ORDER BY 
    1 
, 2; 

ч/т до bimonkey на своем посту Count the number of rows in every Table in a Database in no time!

Если вы хотите «один» запрос, который делает это, то вам нужно объединить выше с вашим смещением и выборки.

В SQL не обманывайте себя, приравнивая меньшее количество строк кода с меньшей степенью сложности или лучшей производительностью.

Я аннотировал следующий запрос, поскольку это действительно довольно просто.

-- Create variables for our usage 
-- http://technet.microsoft.com/en-us/library/ms188927.aspx 
DECLARE @OFFSET int = 30 
, @FETCH int = 15; 

-- Notice the previous statement ends with a semicolon (;) 
-- The following structure is a Common Table Expression (CTE) 
-- Think of it as a single use View 
-- http://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx 
WITH COUNTS AS 
(
    -- This query provides the number of rows in all the tables 
    -- in the current catalog. It is screaming cheetah wheelies fast 
    -- as it does not need to physically read each row from each table 
    -- to generate counts. Instead, it is using system metadata to 
    -- derive the row count. 
    -- After the closing), I will have access to a tabular structure 
    -- called COUNTS 
    SELECT 
     s.[Name] as [Schema] 
    , t.[name] as [Table] 
    , SUM(p.rows) as [RowCount] 
    FROM 
     -- http://technet.microsoft.com/en-us/library/ms176011.aspx 
     sys.schemas s 
     LEFT OUTER JOIN 
      -- http://technet.microsoft.com/en-us/library/ms187406.aspx 
      sys.tables t 
      ON s.schema_id = t.schema_id 
     LEFT OUTER JOIN 
      -- http://technet.microsoft.com/en-us/library/ms175012.aspx 
      sys.partitions p 
      ON t.object_id = p.object_id 
     LEFT OUTER JOIN 
      -- http://technet.microsoft.com/en-us/library/ms189792.aspx 
      sys.allocation_units a 
      ON p.partition_id = a.container_id 
    WHERE 
     p.index_id in(0,1) -- 0 heap table , 1 table with clustered index 
     AND p.rows is not null 
     AND a.type = 1 -- row-data only , not LOB 
    GROUP BY 
     s.[Name] 
    , t.[name] 
) 
SELECT 
    T.* 
, @OFFSET AS StartingRow 
, @FETCH AS PageSize 
-- A subquery that uses the CTE above to extract our table's total row count 
-- The table and schema below must align with the value in your FROM clause 
-- http://technet.microsoft.com/en-us/library/ms189575(v=sql.105).aspx 
, (SELECT C.[RowCount] FROM COUNTS C WHERE C.[schema] = 'dbo' AND C.[Table] = 'MyTable') AS TotalRows 
FROM 
    dbo.MyTable T 
ORDER BY 
    1 
-- http://technet.microsoft.com/en-us/library/gg699618.aspx  
OFFSET 30 ROWS 
FETCH NEXT 15 ROWS ONLY; 
+0

Спасибо за ваш совет. Ваш запрос вроде бы взорвал мой разум, поэтому я пошел с подходом к подсчету, но его полезно знать, что есть более эффективный способ, а не подсчет, когда он мне действительно нужен. – Pearce

Смежные вопросы