2015-10-26 1 views
0

Для реализации пользовательских подкачки решения с использованием C#, ADO.Net, с SQL Server в качестве базы данных, давайте предположим следующие детали:Пользовательские подкачки с помощью столбца данных с зазором в отчетах

Total Records = 1000 
Page Size = 100 

Это означало бы, есть 10 pages, я использую запрос следующим образом:

Min and Max Id (Primary Key) выбираются с помощью скалярных запросов:

Select Min(Id), Max(Id) from Table; 

Select * from Table where Id >= (Min Record) and Id < (Max Record) 

Здесь для каждой сделки, Min and Max Record Value увеличивается на величину Page Size, пока точка Max Record не достигнет или не превысит значение Actual Max.

Это решение отлично подходит для столбца автоматического увеличения/идентичности, который имеет непрерывные значения, но предположим, что используемый столбец имеет разницу в значениях, хотя они все еще могут быть заказаны, например 1000 values находятся между Min = 1 and Max = 3000.

  • я следующие возможные работы вокруг, один предложил в следующих SO link, где дополнительный RowId column используется для достижения того же.

  • Другие варианты будут открывать чтения и чтения записи для данной страницы, создать список и таким образом принести страницу

Что хотите в идеале выполняется Top <PageSize> SQL запрос а, где она выполняется из предопределенной строки или значения, которые я предлагаю, вместо того, чтобы начинать, я бы не стал создавать дополнительный столбец, я могу работать с отключенной архитектурой, не требуется Reader.

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

+0

использовать 'ROW_NUMBER' –

+0

Вот там в ссылке, размещенной в этом вопросе, но я хочу, чтобы избежать создания дополнительного столбца. http://stackoverflow.com/questions/758186/how-to-get-n-rows-starting-from-row-m-from-sorted-table-in-t-sql –

+0

Вы можете использовать это решение, но добавить дополнительный 'SELECT' сверху, чтобы исключить новый столбец, если он настолько нежелателен. –

ответ

1

Если случайно вы используете SQL Server 2012 года, вы можете использовать

Fetch и Offset

например.

-- Variable to hold the offset value 
Declare @RowSkip As int 
-- Variable to hold the fetch value 
Declare @RowFetch As int 

--Set the value of rows to skip 
Set @RowSkip = 20000 
--Set the value of rows to fetch 
Set @RowFetch = 50000 

Select * 
From dbo.tblSample 
Order by (Select 1) 
Offset @RowSkip Row 
Fetch Next @RowFetch Rows Only; 

Пожалуйста, обратитесь: Usage 1: Server Side Paging для получения более подробной информации

+0

Спасибо, это выглядит довольно многообещающим –

1

Вы можете использовать функцию ROW_NUMBER в common table expression(CTE):

WITH CTE AS 
(
    SELECT 
    t.*, 
    RN = ROW_NUMBER() OVER (ORDER BY t.ID) 
    FROM dbo.TableName t 
) 
SELECT ID, Col2, Col3, ... 
FROM CTE 
WHERE RN >= (@pageIndedx * @pageSize) AND RN <= (@pageIndedx * @pageSize) + @pageSize 
+0

Зная это решение, оно находится в SO-ссылке, которая пытается найти способ избежать дополнительных столбец, добавленный как часть CTE –

+0

@MrinalKamboj: вам не нужно выбирать все столбцы, включая столбец номера строки, просто замените 'SELECT *' на 'SELECT allcolumnsfromtable'. –

+0

Но не будет ли CTE, которая является функцией времени выполнения, иметь производительность для таблицы, которая имеет миллионы записей, она выполняется во время выполнения –