SQL分頁儲存過程比拚

2021-04-18 22:54:48 字數 2951 閱讀 8982

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...