关于sqlsever 通用分页脚本的探索

在上一篇文章-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)

关于sqlsever 通用分页脚本的探索_第1张图片

这里使用了局部临时表,如果对这个知识点不清楚,可以看下这篇文章,接下里对语句进行分析

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防止并发导致的冲突

你可能感兴趣的:(数据库)