1 sql server 儲存過程的分頁,這個問題已經討論過幾年了,很多朋友在問我,所以在此發表一下我的觀點
2 建立表:
4 create table [testtable] (
5 [id] [int] identity (1, 1) not null ,
6 [firstname] [nvarchar] (100) collate chinese_prc_ci_as null ,
7 [lastname] [nvarchar] (100) collate chinese_prc_ci_as null ,
8 [country] [nvarchar] (50) collate chinese_prc_ci_as null ,
9 [note] [nvarchar] (2000) collate chinese_prc_ci_as null
10 ) on [primary]
11 go
16 set identity_insert testtable on
18 declare @i int
19 set @i=1
20 while @i<=20000
21 begin
22 insert into testtable([id], firstname, lastname, country,note) values(@i, 'firstname_***','lastname_***','country_***','note_***')
23 set @i=@i+1
24 end
26 set identity_insert testtable off
30 -------------------------------------
32 分頁方案一:(利用not in和select top分頁)
33 語句形式:
34 select top 10 *
35 from testtable
36 where (id not in
37 (select top 20 id
38 from testtable
39 order by id))
40 order by id
43 select top 頁大小 *
44 from testtable
45 where (id not in
46 (select top 頁大小*頁數 id
47 from 表
48 order by id))
49 order by id
51 -------------------------------------
53 分頁方案二:(利用id大於多少和select top分頁)
54 語句形式:
55 select top 10 *
56 from testtable
57 where (id >
58 (select max(id)
59 from (select top 20 id
60 from testtable
61 order by id) as t))
62 order by id
65 select top 頁大小 *
66 from testtable
67 where (id >
68 (select max(id)
69 from (select top 頁大小*頁數 id
70 from 表
71 order by id) as t))
72 order by id
75 -------------------------------------
77 分頁方案三:(利用sql的游標儲存過程分頁)
78 create procedure xiaozhengge
79 @sqlstr nvarchar(4000), --查詢字串
80 @currentpage int, --第n頁
81 @pagesize int --每頁行數
82 as
83 set nocount on
84 declare @p1 int, --p1是游標的id
85 @rowcount int
86 exec sp_cursoropen @p1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
87 select ceiling(
1.0*@rowcount/@pagesize) as 總頁數--,@rowcount as 總行數,@currentpage as 當前頁
88 set @currentpage=(@currentpage-1)*@pagesize+1
89 exec sp_cursorfetch @p1,16,@currentpage,@pagesize
90 exec sp_cursorclose @p1
91 set nocount off
93 其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。
94 建議優化的時候,加上主鍵和索引,查詢效率會提高。
96 通過sql 查詢分析器,顯示比較:我的結論是:
97 分頁方案二:(利用id大於多少和select top分頁)效率最高,需要拼接sql語句
98 分頁方案一:(利用not in和select top分頁) 效率次之,需要拼接sql語句
99 分頁方案三:(利用sql的游標儲存過程分頁) 效率最差,但是最為通用
101 在實際情況中,要具體分析。
sql 儲存過程分頁
create proc myx prpagerecordset querystr nvarchar 1000 keyfield nvarchar 200 pagesize int,pagenumber int as begin declare sqltext as nvarchar 4000 dec...
SQL 儲存過程 分頁
1.俄羅斯儲存過程 的改良版 create procedure pagination1 pagesize int,頁面大小,如每頁儲存20條記錄 pageindex int 當前頁碼 as set nocount on begin declare indextable table id int id...
SQL 分頁儲存過程
create procedure splitpage sql nvarchar 4000 不帶排序語句的sql語句 page int,頁碼 recsperpage int,每頁容納的記錄數 id varchar 255 需要排序的不重複的id號 sort varchar 255 排序欄位及規則 as...