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

来源:互联网 发布:最简单的进销存软件 编辑:程序博客网 时间:2024/04/29 23:47

在上一篇文章-SQLSERVER分页查询中,介绍了如何使用sql脚本进行分页,但是那种方法有个局限性,必须在设计表时把主键名称设置为id,为了解决这个问题,有了这篇文章,接下来进入正题。

先上代码

declare @begin_date datetimedeclare @end_date datetimeselect @begin_date = getdate()--code startSELECT IDENTITY(INT,1,1) as id,permission_user.* INTO #TEMPTABLEFROM  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 endDROP 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防止并发导致的冲突

0 0
原创粉丝点击