轉自: http://blog.csdn.net/lihonggen0/archive/2004/09/14/103511.aspx
1
SQLServer存儲過程的分頁,這個問題已經討論過幾年了,很多朋友在問我,所以在此發(fā)表一下我的觀點
2
建立表:
3
4
CREATE
TABLE
[
TestTable
]
(
5
[
ID
]
[
int
]
IDENTITY
(
1
,
1
)
NOT
NULL
,
6
[
FirstName
]
[
nvarchar
]
(
100
)COLLATEChinese_PRC_CI_AS
NULL
,
7
[
LastName
]
[
nvarchar
]
(
100
)COLLATEChinese_PRC_CI_AS
NULL
,
8
[
Country
]
[
nvarchar
]
(
50
)COLLATEChinese_PRC_CI_AS
NULL
,
9
[
Note
]
[
nvarchar
]
(
2000
)COLLATEChinese_PRC_CI_AS
NULL
10
)
ON
[
PRIMARY
]
11
GO
12
13
14
15
插入數(shù)據:(2萬條,用更多的數(shù)據測試會明顯一些)
16
SET
IDENTITY_INSERT
TestTable
ON
17
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_XXX
'
,
'
LastName_XXX
'
,
'
Country_XXX
'
,
'
Note_XXX
'
)
23
set
@i
=
@i
+
1
24
end
25
26
SET
IDENTITY_INSERT
TestTable
OFF
27
28
29
30
--
-----------------------------------
31
32
分頁方案一:(利用NotIn和SELECTTOP分頁)
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
41
42
43
SELECT
TOP
頁大小
*
44
FROM
TestTable
45
WHERE
(ID
NOT
IN
46
(
SELECT
TOP
頁大小
*
頁數(shù)id
47
FROM
表
48
ORDER
BY
id))
49
ORDER
BY
ID
50
51
--
-----------------------------------
52
53
分頁方案二:(利用ID大于多少和SELECTTOP分頁)
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
63
64
65
SELECT
TOP
頁大小
*
66
FROM
TestTable
67
WHERE
(ID
>
68
(
SELECT
MAX
(id)
69
FROM
(
SELECT
TOP
頁大小
*
頁數(shù)id
70
FROM
表
71
ORDER
BY
id)
AS
T))
72
ORDER
BY
ID
73
74
75
--
-----------------------------------
76
77
分頁方案三:(利用SQL的游標存儲過程分頁)
78
create
procedure
XiaoZhengGe
79
@sqlstr
nvarchar
(
4000
),
--
查詢字符串
80
@currentpage
int
,
--
第N頁
81
@pagesize
int
--
每頁行數(shù)
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
總頁數(shù)
--
,@rowcountas總行數(shù),@currentpageas當前頁
88
set
@currentpage
=
(
@currentpage
-
1
)
*
@pagesize
+
1
89
exec
sp_cursorfetch
@P1
,
16
,
@currentpage
,
@pagesize
90
exec
sp_cursorclose
@P1
91
set
nocount
off
92
93
其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。
94
建議優(yōu)化的時候,加上主鍵和索引,查詢效率會提高。
95
96
通過SQL查詢分析器,顯示比較:我的結論是:
97
分頁方案二:(利用ID大于多少和SELECTTOP分頁)效率最高,需要拼接SQL語句
98
分頁方案一:(利用NotIn和SELECTTOP分頁)效率次之,需要拼接SQL語句
99
分頁方案三:(利用SQL的游標存儲過程分頁)效率最差,但是最為通用
100
101
在實際情況中,要具體分析。

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

更多的討論見:
http://community.csdn.net/Expert/topic/3292/3292678.xml?temp=.1621515
轉自:
http://blog.csdn.net/lihonggen0/archive/2004/09/14/103511.aspx
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
