Вам не нужно дважды запускать запрос.
SELECT ..., total_count = COUNT(*) OVER()
FROM ...
ORDER BY ...
OFFSET 120 ROWS
FETCH NEXT 10 ROWS ONLY;
на основе the chat, кажется, ваша проблема немного сложнее - вы подаете DISTINCT
в результате в дополнение к пейджинга. Это может усложнить определение того, как должен выглядеть COUNT()
и куда он должен идти. Вот один из способов (я просто хочу, чтобы это продемонстрировать, а не пытаться включать технику в свой гораздо более сложный запрос из чата):
USE tempdb;
GO
CREATE TABLE dbo.PagingSample(id INT,name SYSNAME);
-- insert 20 rows, 10 x 2 duplicates
INSERT dbo.PagingSample SELECT TOP (10) [object_id], name FROM sys.all_columns;
INSERT dbo.PagingSample SELECT TOP (10) [object_id], name FROM sys.all_columns;
SELECT COUNT(*) FROM dbo.PagingSample; -- 20
SELECT COUNT(*) FROM (SELECT DISTINCT id, name FROM dbo.PagingSample) AS x; -- 10
SELECT DISTINCT id, name FROM dbo.PagingSample; -- 10 rows
SELECT DISTINCT id, name, COUNT(*) OVER() -- 20 (DISTINCT is not computed yet)
FROM dbo.PagingSample
ORDER BY id, name
OFFSET (0) ROWS FETCH NEXT (5) ROWS ONLY; -- 5 rows
-- this returns 5 rows but shows the pre- and post-distinct counts:
SELECT PostDistinctCount = COUNT(*) OVER() -- 10,
PreDistinctCount -- 20,
id, name
FROM
(
SELECT DISTINCT id, name, PreDistinctCount = COUNT(*) OVER()
FROM dbo.PagingSample
-- INNER JOIN ...
) AS x
ORDER BY id, name
OFFSET (0) ROWS FETCH NEXT (5) ROWS ONLY;
ВЫМЫТЬ:
DROP TABLE dbo.PagingSample;
GO
Это работает именно так, что в динамическом запросе, если я даю имя переменной @oTotalRecords = COUNT (1) OVER(), он говорит, что «Должен объявить скалярную переменную @oTotalRecords». Не могли бы вы рассказать мне, как я могу исправьте это. – user788312
Я читаю значение в переменной и читаю из этого в приложении. – user788312
Могу ли я получить его в переменной из самого sql? – user788312