2016-11-08 4 views
0

Я использую этот запрос, чтобы получить доступ к странице и индексу ограниченного результата из таблицы Customers. Например:Sql server возвращает количество строк из выбранной хранимой процедуры

Если @iStartIndex = 0 и @iRowsPerPage = 10 результат 10 строк от 0 - 10.

SELECT 
     Name, LastName, City      
     FROM Customers         
    OFFSET @iStartIndex ROWS 
    FETCH NEXT @iRowsPerPage ROWS ONLY 

Моя проблема заключается в том, что мне нужно количество всех строк из этого запроса. Например: если есть 1000 строк, запрос будет выбирать только 10 строк. Мне нужны эти 10 строк, но мне также нужно знать, сколько строк в итоге - в этом случае 1000 строк.

Что я уже пробовал - это вернуть @@ ROWCOUNT, но он возвращает 10, результат последнего запроса. Я также попытался написать один отдельный запрос:

SELECT COUNT(*)     
FROM Customers 

и ниже я написал исходный запрос.

Есть ли способ вернуть строки, а также вернуть число строк в виде скалярного значения в той же хранимой процедуре?

+1

Вам нужно будет сделать два запроса, никоим образом не обойти его. Вы можете объединить эти запросы в один результирующий набор, если хотите (путем присвоения результата первой переменной) или использовать выходной параметр. (Технически, вы могли бы сделать это в одном запросе, набив первый в подзапросе, но на самом деле все еще два вопроса в фоновом режиме.) –

+0

Умм ... если в результате есть 10 строк, вы можете объяснить, как 10 не правильный номер? Если вы хотите получить общее количество клиентов, вам нужно будет сделать это как отдельный запрос (или подзапрос). –

+1

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

ответ

1

Я думаю, что вы ищете что-то вроде этого. Просто верните итоговое значение с помощью набора результатов. Это не редкость, особенно в SP для ssrs и других средств отчетности, чтобы возвращать повторяющиеся данные для каждой записи.

DECLARE @TotalCount INT=SELECT COUNT(*) FROM Customers 
SELECT 
    Name, LastName, City, [email protected]      
    FROM Customers         
OFFSET @iStartIndex ROWS 
FETCH NEXT @iRowsPerPage ROWS ONLY 
+0

Я думал об этом решении. слишком. Ведь результат будет повторяться в 10 строк. Если это не так уж редко, почему бы и нет. – FrenkyB

+0

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