当前位置: 代码迷 >> Sql Server >> 关于SQLSERVER2008不能使用offset row fetch next排序的解决办法
  详细解决方案

关于SQLSERVER2008不能使用offset row fetch next排序的解决办法

热度:459   发布时间:2016-04-24 09:53:41.0
关于SQLSERVER2008不能使用offset row fetch next排序的解决方法
之前使用的是SQLSERVER2012,所以以下语句能正确执行
select * from PW_UserInDep_V where DepID=" + depid + " and UserID not in (select PermissionID from MTL_DirectoryPermission where DirectoryID =" + directoryid + ")   order by userid  offset " + pageSize * pageIndex + " row fetch next " + pageSize + " rows only
参数说明:PW_UserInDep_V、MTL_DirectoryPermission  为表名,depid为机构编码 ,UserID(PermissionID)为人员ID,DirectoryID为目录ID, pageSize 为单页显示记录条数,pageIndex为当前页数
这里实现的功能是为目录添加部门人员权限

现在需要使用SQLSERVER2008作为数据库,所以offset ……row fetch next……rows only就没办法执行了
需要用row_number()或其他办法分页查询数据,本人愚笨,一直没弄出来,求改写上面的SQL语句,能在SQLSERVER2008下执行,同样使用以上参数
------解决思路----------------------
类似这样吧,有什么出入再看下吧
SELECT * FROM(
SELECT
 *,ROW_NUMBER()OVER(ORDER BY userid)RN
FROM
PW_UserInDep_V
where
DepID=" + depid + " and UserID not in (select PermissionID from MTL_DirectoryPermission where DirectoryID =" + directoryid + ")
)T
WHERE RN>pageSize * pageIndex AND RN<=pageSize * (pageIndex+1)

------解决思路----------------------
http://www.2cto.com/database/201208/150334.html
看看这个 。

select * from (select *,row_number()over(order by userid) as n from PW_UserInDep_V where DepID=" + depid + " and UserID not in 
(select PermissionID from MTL_DirectoryPermission where DirectoryID =" + directoryid + ")  ) ) as t
where t.n>=pageSize * pageIndex and t.n<= pageSize( pageIndex+1)

试试这个
------解决思路----------------------
在 2012 之的分页基本上两种方法
2000 时代 top n where id not in (top n )。
2005 时代 row_number()  方式。
前者,如果分页过多话,查询后面的页,性能会快速下降,并且是 2 次扫描。
后者,一次扫描,前几页的性能略逊于前者。
  相关解决方案