關於sqlsever 通用分頁尾本的探索
阿新 • • 發佈:2018-12-26
在上一篇文章-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防止併發導致的衝突