关于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)


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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值