存储过程
1
--TOP n 实现的通用分页存储过程(转自邹建)2
CREATE PROC sp_PageView3
@tbname sysname, --要分页显示的表名4
@FieldKey nvarchar(1000), --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段5
@PageCurrent int=1, --要显示的页码6
@PageSize int=10, --每页的大小(记录数)7
@FieldShow nvarchar(1000)='', --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段8
@FieldOrder nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC9
用于指定排序顺序10
@Where nvarchar(1000)='', --查询条件11
@PageCount int OUTPUT --总页数12
AS13
SET NOCOUNT ON14
--检查对象是否有效15
IF OBJECT_ID(@tbname) IS NULL16
BEGIN17
RAISERROR(N'对象"%s"不存在',1,16,@tbname)18
RETURN19
END20
IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=021
AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=022
AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=023
BEGIN24
RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)25
RETURN26
END27

28
--分页字段检查29
IF ISNULL(@FieldKey,N'')=''30
BEGIN31
RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)32
RETURN33
END34

35
--其他参数检查及规范36
IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=137
IF ISNULL(@PageSize,0)<1 SET @PageSize=1038
IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'39
IF ISNULL(@FieldOrder,N'')=N''40
SET @FieldOrder=N''41
ELSE42
SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)43
IF ISNULL(@Where,N'')=N''44
SET @Where=N''45
ELSE46
SET @Where=N'WHERE ('+@Where+N')'47

48
--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)49
IF @PageCount IS NULL50
BEGIN51
DECLARE @sql nvarchar(4000)52
SET @sql=N'SELECT @PageCount=COUNT(*)'53
+N' FROM '+@tbname54
+N' '+@Where55
EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT56
SET @PageCount=(@PageCount+@PageSize-1)/@PageSize57
END58

59
--计算分页显示的TOPN值60
DECLARE @TopN varchar(20),@TopN1 varchar(20)61
SELECT @TopN=@PageSize,62
@TopN1=(@PageCurrent-1)*@PageSize63

64
--第一页直接显示65
IF @PageCurrent=166
EXEC(N'SELECT TOP '+@TopN67
+N' '+@FieldShow68
+N' FROM '+@tbname69
+N' '+@Where70
+N' '+@FieldOrder)71
ELSE72
BEGIN73
--处理别名74
IF @FieldShow=N'*'75
SET @FieldShow=N'a.*'76

77
--生成主键(惟一键)处理条件78
DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000),79
@s nvarchar(1000),@Field sysname80
SELECT @Where1=N'',@Where2=N'',@s=@FieldKey81
WHILE CHARINDEX(N',',@s)>082
SELECT @Field=LEFT(@s,CHARINDEX(N',',@s)-1),83
@s=STUFF(@s,1,CHARINDEX(N',',@s),N''),84
@Where1=@Where1+N' AND a.'+@Field+N'=b.'+@Field,85
@Where2=@Where2+N' AND b.'+@Field+N' IS NULL',86
@Where=REPLACE(@Where,@Field,N'a.'+@Field),87
@FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),88
@FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)89
SELECT @Where=REPLACE(@Where,@s,N'a.'+@s),90
@FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s),91
@FieldShow=REPLACE(@FieldShow,@s,N'a.'+@s),92
@Where1=STUFF(@Where1+N' AND a.'+@s+N'=b.'+@s,1,5,N''), 93
@Where2=CASE94
WHEN @Where='' THEN N'WHERE ('95
ELSE @Where+N' AND ('96
END+N'b.'+@s+N' IS NULL'+@Where2+N')'97

98
--执行查询99
EXEC(N'SELECT TOP '+@TopN100
+N' '+@FieldShow101
+N' FROM '+@tbname102
+N' a LEFT JOIN(SELECT TOP '+@TopN1103
+N' '+@FieldKey104
+N' FROM '+@tbname105
+N' a '+@Where106
+N' '+@FieldOrder107
+N')b ON '+@Where1108
+N' '+@Where2109
+N' '+@FieldOrder)110
END111

1
-- 字符串缓存实现的通用分页存储过程(转自邹建)2
CREATE PROC sp_PageView3
@tbname sysname, --要分页显示的表名4
@FieldKey sysname, --用于定位记录的主键(惟一键)字段,只能是单个字段5
@PageCurrent int=1, --要显示的页码6
@PageSize int=10, --每页的大小(记录数)7
@FieldShow nvarchar(1000)='', --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段8
@FieldOrder nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC9
用于指定排序顺序10
@Where nvarchar(1000)='', --查询条件11
@PageCount int OUTPUT --总页数12
AS13
DECLARE @sql nvarchar(4000)14
SET NOCOUNT ON15
--检查对象是否有效16
IF OBJECT_ID(@tbname) IS NULL17
BEGIN18
RAISERROR(N'对象"%s"不存在',1,16,@tbname)19
RETURN20
END21
IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=022
AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=023
AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=024
BEGIN25
RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)26
RETURN27
END28

29
--分页字段检查30
IF ISNULL(@FieldKey,N'')=''31
BEGIN32
RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)33
RETURN34
END35

36
--其他参数检查及规范37
IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=138
IF ISNULL(@PageSize,0)<1 SET @PageSize=1039
IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'40
IF ISNULL(@FieldOrder,N'')=N''41
SET @FieldOrder=N''42
ELSE43
SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)44
IF ISNULL(@Where,N'')=N''45
SET @Where=N''46
ELSE47
SET @Where=N'WHERE ('+@Where+N')'48

49
--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)50
IF @PageCount IS NULL51
BEGIN52
SET @sql=N'SELECT @PageCount=COUNT(*)'53
+N' FROM '+@tbname54
+N' '+@Where55
EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT56
SET @PageCount=(@PageCount+@PageSize-1)/@PageSize57
END58

59
--计算分页显示的TOPN值60
DECLARE @TopN varchar(20),@TopN1 varchar(20)61
SELECT @TopN=@PageSize,62
@TopN1=@PageCurrent*@PageSize 63

64
--第一页直接显示65
IF @PageCurrent=166
EXEC(N'SELECT TOP '+@TopN67
+N' '+@FieldShow68
+N' FROM '+@tbname69
+N' '+@Where70
+N' '+@FieldOrder)71
ELSE72
BEGIN73
SELECT @PageCurrent=@TopN1,74
@sql=N'SELECT @n=@n-1,@s=CASE WHEN @n<'+@TopN75
+N' THEN @s+N'',''+QUOTENAME(RTRIM(CAST('+@FieldKey76
+N' as varchar(8000))),N'''''''') ELSE N'''' END FROM '+@tbname77
+N' '+@Where78
+N' '+@FieldOrder79
SET ROWCOUNT @PageCurrent80
EXEC sp_executesql @sql,81
N'@n int,@s nvarchar(4000) OUTPUT',82
@PageCurrent,@sql OUTPUT83
SET ROWCOUNT 084
IF @sql=N''85
EXEC(N'SELECT TOP 0'86
+N' '+@FieldShow87
+N' FROM '+@tbname)88
ELSE89
BEGIN90
SET @sql=STUFF(@sql,1,1,N'') 91
--执行查询92
EXEC(N'SELECT TOP '+@TopN93
+N' '+@FieldShow94
+N' FROM '+@tbname95
+N' WHERE '+@FieldKey96
+N' IN('+@sql97

浙公网安备 33010602011771号