在上一篇文章-SQLSERVER分页查询中,介绍了如何使用sql脚本进行分页,但是那种方法有个局限性,必须在设计表时把主键名称设置为id,为了解决这个问题,有了这篇文章,接下来进入正题。
先上代码
declare @begin_date datetime
declare @end_date datetime
select @begin_date = getdate()
--code start
SELECT IDENTITY(INT,1,1) as id,
permission_user.* INTO #TEMPTABLE
FROM permission_user ,user_role
where permission_user.UserID=user_role.UserID;
select top 50 numComImg.* from
( select row_number() over(order by id asc) as rownumber,* from
(select * FROM #TEMPTABLE) as comImg)
as numComImg where rownumber>((4-1)*50)
--code end
DROP TABLE #TEMPTABLE;
select @end_date = getdate()
select datediff(ms,@begin_date,@end_date) as '毫秒'
看下效果(慢了23ms)
这里使用了局部临时表,如果对这个知识点不清楚,可以看下这篇文章,接下里对语句进行分析
SELECT IIDENTITY(INT,1,1) as temp_id,
* INTO #TEMPTABLE
FROM pagetest
select top 50 numComImg.* from
( select row_number() over(order by temp_id asc) as rownumber,* from
(select * FROM #TEMPTABLE) as comImg)
as numComImg where rownumber>((33-1)*50)
DROP TABLE #TEMPTABLE;
其中
IIDENTITY(INT,1,1) as temp_id 的作用是在目标表上追加一个自增列(注意:目标表中不允许包含有自增列,否则临时表会创建失败)
#TEMPTABLE是临时表的名字
33是页索引(从1开始)
50是每页条数
在具体应用中可能会遇到并发问题,这时候可以在构造sql脚本时为#TEMPTABLE 加上一串Guid或用户id防止并发导致的冲突