Я имел дело с этой самой проблемой, и в конце концов я нашел несколько решений, ни одно из которых не является впечатляющим, но выполняет работу:
- Запрос дважды
- Возвращает счетчик в качестве одного из столбцов
- Запишите результаты во временную таблицу, возвращая счет в виде столбца
В первом решении вы бы сделали что-то вроде:
...
, @Count int OUTPUT
AS
Select @Count = (
Select Count(*)
From comments
Where comments.postid = @postid
And Col1 = ... And Col2 = ...
)
With NumberedResults As
(
Select ...
, ROW_NUMBER() OVER( ORDER BY dateposted ASC ) As Num
From comments
Where Col1 = ... And Col2 = ...
)
Select ...
From NumberedResults
Where Num Between ( @PageIndex - 1 ) * @PageSize + 1 and @PageIndex * @PageSize
Очевидным недостатком является то, что если запрос дорогой, вы делаете это дважды.
Во втором решении вы просто возвращаете счет как часть результатов. Затем вы должны были бы снять счет с первой записи в коде вашего бизнес-уровня. Преимущество в том, что вы делаете дорогой запрос только один раз. Недостатком является то, что вы возвращаете дополнительные четыре байта для каждой строки в результате.
With NumberedResults As
(
Select ...
, ROW_NUMBER() OVER( ORDER BY dateposted ASC ) As Num
From comments
Where Col1 = ... And Col2 = ...
)
Select ...
, ( Select Count(*) From NumberedResults ) As TotalCount
From NumberedResults
Where Num Between ( @PageIndex - 1 ) * @PageSize + 1 and @PageIndex * @PageSize
Третье решение - вариант второго, в котором вы помещаете результаты в временную таблицу и устанавливаете свой параметр out из первой записи
...
, @TotalCount int OUTPUT
AS
Declare @PagedResults Table (
Col1 ...
, ...
, TotalCount int
)
With NumberedResults As
(
Select ...
, ROW_NUMBER() OVER( ORDER BY dateposted ASC ) As Num
From comments
)
Insert @PagedResults( Col1...., TotalCount )
Select ...
, ( Select Count(*) From NumberedResults ) As TotalCount
From NumberedResults
Where Num Between ( @PageIndex - 1 ) * @PageSize + 1 and @PageIndex * @PageSize
Set @TotalCount = ( Select TOP 1 TotalCount From @PagedResults )
Select ...
From @PagedResults