1. 程式人生 > >關於sqlsever 通用分頁尾本的探索

關於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防止併發導致的衝突