У меня в хранимой процедуре следующий обычный запрос
Select DISTINCT UI.UserId,UI.UserName, UI.FullName
From UserInfo as UI ,UserGroupRelation as UGR
Where UI.UserId = UGR.UserId AND UGR.GroupId = @pGroupId AND UI.Type = @pType
Order by UI.UserId ASC
и определение этих переменных в хранимых процедурах
@pGroupId smallint,
@pType tinyint,
@pStartIndex smallint,
@pPageSize smallint
Теперь, после того как я преобразовал этот запрос в пейджинговый, я написал следующий запрос
SELECT UserTable.UserId,
UserTable.UserName,
UserTable.FullName
From(
Select ROW_NUMBER() OVER (
ORDER BY UI.UserId,
UI.UserName,
UI.FullName ) as [Row_Number],
UI.UserId,
UI.UserName,
UI.FullName
From UserInfo as UI,UserGroupRelation as UGR
Where UI.UserId = UGR.UserId AND UGR.GroupId = @pGroupId AND UI.Type = @pType
ORDER BY UI.UserId ASC ) as UserTable
where UserTable.[Row_Number] BETWEEN @pStartIndex AND @pStartIndex + @pPageSize
ORDER BY UserTable.[Row_Number]
Но SQL-сервер возвращает ошибку, говоря:
Предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросах и общих табличных выражениях, если также не указано TOP или FOR XML.
Есть ли другая альтернатива или что не так с этим запросом.
Теперь он запущен, когда я добавил оператор Top в подзапрос, подобный этому
SELECT UserTable.UserId,
UserTable.UserName,
UserTable.FullName
From(
Select Top(@pPageSize) ROW_NUMBER() OVER (
ORDER BY UI.UserId,
UI.UserName,
UI.FullName ) as [Row_Number],
UI.UserId,
UI.UserName,
UI.FullName
From UserInfo as UI,UserGroupRelation as UGR
Where UI.UserId = UGR.UserId AND UGR.GroupId = @pGroupId AND UI.Type = @pType
ORDER BY UI.UserId ASC ) as UserTable
where UserTable.[Row_Number] BETWEEN @pStartIndex AND @pStartIndex + @pPageSize
ORDER BY UserTable.[Row_Number]
Но я не думаю, что это эффективный. Есть какой-то другой эффективный способ.