Преобразование простого запроса T-SQL в пейджинговый запрос внутри хранимой процедуры - PullRequest
0 голосов
/ 18 декабря 2011

У меня в хранимой процедуре следующий обычный запрос

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]

Но я не думаю, что это эффективный. Есть какой-то другой эффективный способ.

1 Ответ

2 голосов
/ 18 декабря 2011

Наконец я нашел следующий Query как окончательный и эффективный

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 ) as UserTable
       where UserTable.[Row_Number] BETWEEN @pStartIndex AND @pStartIndex + @pPageSize -1           
       ORDER BY UserTable.[Row_Number]
...