1
Community_Common_Count_USP
2
/*
3
作者: SLIGHTBOY
4
建立日期: 2005-8-17
5
修改日期:
6
存储作用: 通用记录统计
7
作用数据库: 自定义
8
输入变量:
9
@KeyColumn 主键字段名
10
@TableName 表格名称
11
@SearchQuery 查询条件 默认 ''
12
输出变量:
13
中间变量:
14
*/
15
CREATE PROCEDURE dbo.Community_Common_Count_USP
16
(
17
@KeyColumn varchar(20),
18
@TableName varchar(20),
19
@SearchQuery varchar(400) = ''
20
)
21
AS
22
SET NOCOUNT ON
23
DECLARE @Timer datetime
24
SET @Timer = getdate()
25
26
IF ( @SearchQuery IS Not NULL ) AND ( @SearchQuery <> '' )
27
exec('SELECT Count('+ @KeyColumn +') FROM ['+ @TableName +'] Where '+ @SearchQuery)
28
Else
29
exec('SELECT Count('+ @KeyColumn +') FROM ['+ @TableName +']')
30
31
print(DATEDIFF(millisecond, @Timer, getdate()))
32
GO
33
34
35
Community_Common_Page_USP
36
/*
37
作者: SLIGHTBOY
38
建立日期: 2005-8-12
39
修改日期:
40
存储作用: 通用分页存储过程
41
作用数据库: 自定义
42
版本: 1.0
43
输入变量:
44
@AbsolutePage 请求页 默认 1
45
@PageSize 每页记录数 默认 20
46
@RecordCount 总记录
47
@KeyColumn 主键字段名
48
@SelectColumn 查询字段
49
@TableName 表格名称
50
@Sort 排序方式 DESC
51
@SearchQuery 查询条件 默认 ''
52
@ExpandQuery 扩展内容(FOR XML EXPLICIT) 默认 ''
53
输出变量:
54
过程变量
55
@SqlQuery 查询语句
56
@AbsolutePosition 当前位置
57
*/
58
CREATE PROCEDURE dbo.Community_Common_Page_USP
59
(
60
@AbsolutePage int = 1,
61
@PageSize int = 20,
62
@RecordCount int,
63
@KeyColumn varchar(20),
64
@SelectColumn varchar(1000),
65
@TableName varchar(20),
66
@Sort varchar(4) = '',
67
@SearchQuery varchar(400) = '',
68
@ExpandQuery varchar(50) = ''
69
)
70
AS
71
SET NOCOUNT ON
72
DECLARE @Timer datetime
73
SET @Timer = getdate()
74
75
DECLARE @SqlQuery varchar(3000)
76
DECLARE @AbsolutePosition int
77
SET @AbsolutePosition = @AbsolutePage * @PageSize
78
79
IF ( @AbsolutePosition = @PageSize )
80
IF ( @Sort = 1 )
81
SET @SqlQuery = '
82
SELECT TOP '+ LTRIM( STR( @PageSize ) ) +'
83
'+ @SelectColumn +'
84
FROM ['+ @TableName +']
85
'+ dbo.iif(@SearchQuery, 'Where '+ @SearchQuery, '' ) +'
86
ORDER BY '+ @KeyColumn +' ASC
87
'+ @ExpandQuery
88
Else
89
90
SET @SqlQuery = '
91
SELECT TOP '+ LTRIM( STR( @PageSize ) ) +'
92
'+ @SelectColumn +'
93
FROM ['+ @TableName +']
94
'+ dbo.iif(@SearchQuery, 'Where '+ @SearchQuery, '' ) +'
95
ORDER BY '+ @KeyColumn +' DESC
96
'+ @ExpandQuery
97
-- 大于 首页 小于 中间页
98
Else IF ( @AbsolutePosition <= @RecordCount/2 )
99
IF ( @Sort = 1 )
100
SET @SqlQuery = '
101
SELECT TOP '+ LTRIM( STR( @PageSize ) ) +' '+ @SelectColumn +'
102
FROM ['+ @TableName +']
103
WHERE '+ @KeyColumn +' >
104
(
105
SELECT MAX('+ @KeyColumn +')
106
FROM
107
(
108
SELECT TOP '+ LTRIM( STR( ( @AbsolutePage - 1)*@PageSize) ) +'
109
'+ @KeyColumn +'
110
FROM ['+ @TableName +']
111
'+ dbo.iif(@SearchQuery, 'Where '+ @SearchQuery, '' ) +'
112
ORDER BY '+ @KeyColumn +' ASC
113
) As Child
114
)
115
'+ dbo.iif(@SearchQuery, ' AND '+ @SearchQuery, '' ) +'
116
ORDER BY '+ @KeyColumn +' ASC
117
'+ @ExpandQuery
118
Else
119
SET @SqlQuery = '
120
SELECT TOP '+ LTRIM( STR( @PageSize ) ) +' '+ @SelectColumn +'
121
FROM ['+ @TableName +']
122
WHERE '+ @KeyColumn +' <=
123
(
124
SELECT Min('+ @KeyColumn +')
125
FROM
126
(
127
SELECT TOP '+ LTRIM( STR( ( @AbsolutePage - 1)*@PageSize + 1 ) ) +'
128
'+ @KeyColumn +'
129
FROM ['+ @TableName +']
130
'+ dbo.iif(@SearchQuery, 'Where '+ @SearchQuery, '' ) +'
131
ORDER BY '+ @KeyColumn +' DESC
132
) As Child
133
)
134
'+ dbo.iif(@SearchQuery, ' AND '+ @SearchQuery, '' ) +'
135
ORDER BY '+ @KeyColumn +' DESC
136
'+ @ExpandQuery
137
Else IF (@AbsolutePosition > @RecordCount/2 )
138
IF ( @Sort = 1 )
139
SET @SqlQuery = '
140
SELECT TOP '+ LTRIM( STR( @PageSize ) ) +' '+ @SelectColumn +'
141
FROM ['+ @TableName +']
142
WHERE '+ @KeyColumn +' >
143
(
144
SELECT Min('+ @KeyColumn +')
145
FROM
146
(
147
SELECT TOP '+ LTRIM( STR( @RecordCount - ((@AbsolutePage - 1) * @PageSize ) + 1) ) +'
148
'+ @KeyColumn +'
149
FROM ['+ @TableName +']
150
'+ dbo.iif(@SearchQuery, 'Where '+ @SearchQuery, '' ) +'
151
ORDER BY '+ @KeyColumn +' DESC
152
) As Child
153
)
154
'+ dbo.iif(@SearchQuery, ' AND '+ @SearchQuery, '' ) +'
155
ORDER BY '+ @KeyColumn +' ASC
156
'+ @ExpandQuery
157
Else
158
SET @SqlQuery = '
159
SELECT TOP '+ LTRIM( STR( @PageSize ) ) +' '+ @SelectColumn +'
160
FROM ['+ @TableName +']
161
WHERE '+ @KeyColumn +' <
162
(
163
SELECT MAX('+ @KeyColumn +')
164
FROM
165
(
166
SELECT TOP '+ LTRIM( STR( @RecordCount - ((@AbsolutePage - 1) * @PageSize ) + 1) ) +'
167
'+ @KeyColumn +'
168
FROM ['+ @TableName +']
169
'+ dbo.iif(@SearchQuery, 'Where '+ @SearchQuery, '' ) +'
170
ORDER BY '+ @KeyColumn +' ASC
171
) As Child
172
)
173
'+ dbo.iif(@SearchQuery, ' AND '+ @SearchQuery, '' ) +'
174
ORDER BY '+ @KeyColumn +' DESC
175
'+ @ExpandQuery
176
177
exec(@SqlQuery)
178
print(@SqlQuery)
179
print(DATEDIFF(millisecond, @Timer, getdate()))
180
181
GO

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

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

第一个存储过程 计算总记录
第二个存储过程 为选择记录部分
根据传入页码判断位置 实现三个逻辑
请求页 = 第一页
请求页 <= 总页/2
请求页 > 总页/2
并且针对排序方式做了优化
总记录统计部分消耗资源比较大 尽可能做冗余
具体参数作用 存储过程说明里已经做了说明 这里就不重复了