加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

通用sqlserver分页存储过程1

发布时间:2020-12-12 13:41:24 所属栏目:MsSql教程 来源:网络整理
导读:来自: http://www.cnblogs.com/nzperfect/archive/2007/05/08/738999.html 单主键: CREATE PROC P_viewPage /**/ /* nzperfect [no_mIss] 高效通用分页存储过程(双向检索) 2007.5.7 QQ:34813284 敬告:适用于单一主键或存在唯一值列的表或视图 ps:Sql语句
来自: http://www.cnblogs.com/nzperfect/archive/2007/05/08/738999.html
单主键:

None.gif

CREATE PROC P_viewPage

None.gif


ExpandedBlockStart.gif

/**/ /*

InBlock.gif

nzperfect [no_mIss] 高效通用分页存储过程(双向检索) 2007.5.7 QQ:34813284

InBlock.gif

敬告:适用于单一主键或存在唯一值列的表或视图

InBlock.gif

ps:Sql语句为8000字节,调用时请注意传入参数及sql总长度不要超过指定范围

ExpandedBlockEnd.gif

*/

None.gif

@TableName VARCHAR ( 200 ), -- 表名

None.gif

@FieldList VARCHAR ( 2000 ), -- 显示列名,如果是全部字段则为*

None.gif

@PrimaryKey VARCHAR ( 100 ), -- 单一主键或唯一值键

None.gif

@Where VARCHAR ( 2000 ), -- 查询条件 不含'where'字符,如id>10 and len(userid)>9

None.gif

@Order VARCHAR ( 1000 ), -- 排序 不含'order by'字符,如id asc,userid desc,必须指定asc或desc

None.gif

-- 注意当@SortType=3时生效,记住一定要在最后加上主键,否则会让你比较郁闷

None.gif

@SortType INT , -- 排序规则 1:正序asc 2:倒序desc 3:多列排序方法

None.gif

@RecorderCount INT , -- 记录总数 0:会返回总记录

None.gif

@PageSize INT , -- 每页输出的记录数

None.gif

@PageIndex INT , -- 当前页数

None.gif

@TotalCount INT OUTPUT, -- 记返回总记录

None.gif

@TotalPageCount INT OUTPUT -- 返回总页数

None.gif

AS

None.gif

SET NOCOUNT ON

None.gif


None.gif

IF ISNULL ( @TotalCount , '' ) = '' SET @TotalCount = 0

None.gif

SET @Order = RTRIM ( LTRIM ( @Order ))

None.gif

SET @PrimaryKey = RTRIM ( LTRIM ( @PrimaryKey ))

None.gif

SET @FieldList = REPLACE ( RTRIM ( LTRIM ( @FieldList )), ' ' , '' )

None.gif


None.gif

WHILE CHARINDEX ( ' , ' , @Order ) > 0 OR CHARINDEX ( ' , @Order ) > 0

None.gif

BEGIN

None.gif

SET @Order = REPLACE ( @Order , ' , ' )

None.gif

SET @Order = REPLACE ( @Order , ' )

None.gif

END

None.gif


None.gif

IF ISNULL ( @TableName , '' ) = '' OR ISNULL ( @FieldList , '' ) = ''

None.gif

OR ISNULL ( @PrimaryKey , '' ) = ''

None.gif

OR @SortType < 1 OR @SortType > 3

None.gif

OR @RecorderCount < 0 OR @PageSize < 0 OR @PageIndex < 0

None.gif

BEGIN

None.gif

PRINT ( ' ERR_00 ' )

None.gif

RETURN

None.gif

END

None.gif


None.gif

IF @SortType = 3

None.gif

BEGIN

None.gif

IF ( UPPER ( RIGHT ( @Order , 4 )) != ' ASC ' AND UPPER ( RIGHT ( @Order , 5 )) != ' DESC ' )

None.gif

BEGIN PRINT ( ' ERR_02 ' ) RETURN END

None.gif

END

None.gif


None.gif

DECLARE @new_where1 VARCHAR ( 1000 )

None.gif

DECLARE @new_where2 VARCHAR ( 1000 )

None.gif

DECLARE @new_order1 VARCHAR ( 1000 )

None.gif

DECLARE @new_order2 VARCHAR ( 1000 )

None.gif

DECLARE @new_order3 VARCHAR ( 1000 )

None.gif

DECLARE @Sql VARCHAR ( 8000 )

None.gif

DECLARE @SqlCount NVARCHAR ( 4000 )

None.gif


None.gif

IF ISNULL ( @where , '' ) = ''

None.gif

BEGIN

None.gif

SET @new_where1 = ' '

None.gif

SET @new_where2 = ' WHERE '

None.gif

END

None.gif

ELSE

None.gif

BEGIN

None.gif

SET @new_where1 = ' WHERE ' + @where

None.gif

SET @new_where2 = ' WHERE ' + @where + ' AND '

None.gif

END

None.gif


None.gif

IF ISNULL ( @order , '' ) = '' OR @SortType = 1 OR @SortType = 2

None.gif

BEGIN

None.gif

IF @SortType = 1

None.gif

BEGIN

None.gif

SET @new_order1 = ' ORDER BY ' + @PrimaryKey + ' ASC '

None.gif

SET @new_order2 = ' ORDER BY ' + @PrimaryKey + ' DESC '

None.gif

END

None.gif

IF @SortType = 2

None.gif

BEGIN

None.gif

SET @new_order1 = ' ORDER BY ' + @PrimaryKey + ' DESC '

None.gif

SET @new_order2 = ' ORDER BY ' + @PrimaryKey + ' ASC '

None.gif

END

None.gif

END

None.gif

ELSE

None.gif

BEGIN

None.gif

SET @new_order1 = ' ORDER BY ' + @Order

None.gif

END

None.gif


None.gif

IF @SortType = 3 AND CHARINDEX ( ' , ' + @PrimaryKey + ' ' , ' + @Order ) > 0

None.gif

BEGIN

None.gif

SET @new_order1 = ' ORDER BY ' + @Order

None.gif

SET @new_order2 = @Order + ' , '

None.gif

SET @new_order2 = REPLACE ( REPLACE ( @new_order2 , ' ASC, ' {ASC}, ' ), ' DESC, ' {DESC}, ' )

None.gif

SET @new_order2 = REPLACE ( REPLACE ( @new_order2 , ' )

None.gif

SET @new_order2 = ' ORDER BY ' + SUBSTRING ( @new_order2 , 1 , LEN ( @new_order2 ) - 1 )

None.gif

IF @FieldList <> ' * '

None.gif

BEGIN

None.gif

SET @new_order3 = REPLACE ( REPLACE ( @Order + ' , ' )

None.gif

SET @FieldList = ' , ' + @FieldList

None.gif

WHILE CHARINDEX ( ' , @new_order3 ) > 0

None.gif

BEGIN

None.gif

IF CHARINDEX ( SUBSTRING ( ' , ' + @new_order3 , CHARINDEX ( ' , @new_order3 )), ' + @FieldList + ' , ' ) > 0

None.gif

BEGIN

None.gif

SET @FieldList =

None.gif

@FieldList + ' , ' + SUBSTRING ( @new_order3 , @new_order3 ))

None.gif

END

None.gif

SET @new_order3 =

None.gif

SUBSTRING ( @new_order3 , @new_order3 ) + 1 , LEN ( @new_order3 ))

None.gif

END

None.gif

SET @FieldList = SUBSTRING ( @FieldList , 2 , LEN ( @FieldList ))

None.gif

END

None.gif

END

None.gif


None.gif

SET @SqlCount = ' SELECT @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/ '

None.gif

+ CAST ( @PageSize AS VARCHAR ) + ' ) FROM ' + @TableName + @new_where1

None.gif


None.gif

IF @RecorderCount = 0

None.gif

BEGIN

None.gif

EXEC SP_EXECUTESQL @SqlCount ,N ' @TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT ' ,

None.gif

@TotalCount OUTPUT, @TotalPageCount OUTPUT

None.gif

END

None.gif

ELSE

None.gif

BEGIN

None.gif

SELECT @TotalCount = @RecorderCount

None.gif

END

None.gif


None.gif

IF @PageIndex > CEILING (( @TotalCount + 0.0 ) / @PageSize )

None.gif

BEGIN

None.gif

SET @PageIndex = CEILING (( @TotalCount + 0.0 ) / @PageSize )

None.gif

END

None.gif


None.gif

IF @PageIndex = 1 OR @PageIndex >= CEILING (( @TotalCount + 0.0 ) / @PageSize )

None.gif

BEGIN

None.gif

IF @PageIndex = 1 -- 返回第一页数据

None.gif

BEGIN

None.gif

SET @Sql = ' SELECT TOP ' + STR ( @PageSize ) + ' ' + @FieldList + ' FROM '

None.gif

+ @TableName + @new_where1 + @new_order1

None.gif

END

None.gif

IF @PageIndex >= CEILING (( @TotalCount + 0.0 ) / @PageSize ) -- 返回最后一页数据

None.gif

BEGIN

None.gif

SET @Sql = ' SELECT TOP ' + STR ( @PageSize ) + ' ' + @FieldList + ' FROM ( '

None.gif

+ ' SELECT TOP ' + STR ( ABS ( @PageSize * @PageIndex - @TotalCount - @PageSize ))

None.gif

+ ' ' + @FieldList + ' FROM '

None.gif

+ @TableName + @new_where1 + @new_order2 + ' ) AS TMP '

None.gif

+ @new_order1

None.gif

END

None.gif

END

None.gif

ELSE

None.gif

BEGIN

None.gif

IF @SortType = 1 -- 仅主键正序排序

None.gif

BEGIN

None.gif

IF @PageIndex <= CEILING (( @TotalCount + 0.0 ) / @PageSize ) / 2 -- 正向检索

None.gif

BEGIN

None.gif

SET @Sql = ' SELECT TOP ' + STR ( @PageSize ) + ' ' + @FieldList + ' FROM '

None.gif

+ @TableName + @new_where2 + @PrimaryKey + ' > '

None.gif

+ ' (SELECT MAX( ' + @PrimaryKey + ' ) FROM (SELECT TOP '

None.gif

+ STR ( @PageSize * ( @PageIndex - 1 )) + ' ' + @PrimaryKey

None.gif

+ ' FROM ' + @TableName

None.gif

+ @new_where1 + @new_order1 + ' ) AS TMP) ' + @new_order1

None.gif

END

None.gif

ELSE -- 反向检索

None.gif

BEGIN

None.gif

SET @Sql = ' SELECT TOP ' + STR ( @PageSize ) + ' ' + @FieldList + ' FROM ( '

None.gif

+ ' SELECT TOP ' + STR ( @PageSize ) + ' '

None.gif

+ @FieldList + ' FROM '

None.gif

+ @TableName + @new_where2 + @PrimaryKey + ' < '

None.gif

+ ' (SELECT MIN( ' + @PrimaryKey + ' ) FROM (SELECT TOP '

None.gif

+ STR ( @TotalCount - @PageSize * @PageIndex ) + ' ' + @PrimaryKey

None.gif

+ ' FROM ' + @TableName

None.gif

+ @new_where1 + @new_order2 + ' ) AS TMP) ' + @new_order2

None.gif

+ ' ) AS TMP ' + @new_order1

None.gif

END

None.gif

END

None.gif

IF @SortType = 2 -- 仅主键反序排序

None.gif

BEGIN

None.gif

IF @PageIndex <= CEILING (( @TotalCount + 0.0 ) / @PageSize ) / 2 -- 正向检索

None.gif

BEGIN

None.gif

SET @Sql = ' SELECT TOP ' + STR ( @PageSize ) + ' ' + @FieldList + ' FROM '

None.gif

+ @TableName + @new_where2 + @PrimaryKey + ' < '

None.gif

+ ' (SELECT MIN( ' + @PrimaryKey + ' ) FROM (SELECT TOP '

None.gif

+ STR ( @PageSize * ( @PageIndex - 1 )) + ' ' + @PrimaryKey

None.gif

+ ' FROM ' + @TableName

None.gif

+ @new_where1 + @new_order1 + ' ) AS TMP) ' + @new_order1

None.gif

END

None.gif

ELSE -- 反向检索

None.gif

BEGIN

None.gif

SET @Sql = ' SELECT TOP ' + STR ( @PageSize ) + ' ' + @FieldList + ' FROM ( '

None.gif

+ ' SELECT TOP ' + STR ( @PageSize ) + ' '

None.gif

+ @FieldList + ' FROM '

None.gif

+ @TableName + @new_where2 + @PrimaryKey + ' > '

None.gif

+ ' (SELECT MAX( ' + @PrimaryKey + ' ) FROM (SELECT TOP '

None.gif

+ STR ( @TotalCount - @PageSize * @PageIndex ) + ' ' + @PrimaryKey

None.gif

+ ' FROM ' + @TableName

None.gif

+ @new_where1 + @new_order2 + ' ) AS TMP) ' + @new_order2

None.gif

+ ' ) AS TMP ' + @new_order1

None.gif

END

None.gif

END

None.gif

IF @SortType = 3 -- 多列排序,必须包含主键,且放置最后,否则不处理

None.gif

BEGIN

None.gif

IF CHARINDEX ( ' , ' + @PrimaryKey + ' ' , ' + @Order ) = 0

None.gif

BEGIN PRINT ( ' ERR_02 ' ) RETURN END

None.gif

IF @PageIndex <= CEILING (( @TotalCount + 0.0 ) / @PageSize ) / 2 -- 正向检索

None.gif

BEGIN

None.gif

SET @Sql = ' SELECT TOP ' + STR ( @PageSize ) + ' ' + @FieldList + ' FROM ( '

None.gif

+ ' SELECT TOP ' + STR ( @PageSize ) + ' ' + @FieldList + ' FROM ( '

None.gif

+ ' SELECT TOP ' + STR ( @PageSize * @PageIndex ) + ' ' + @FieldList

None.gif

+ ' FROM ' + @TableName + @new_where1 + @new_order1 + ' ) AS TMP '

None.gif

+ @new_order2 + ' ) AS TMP ' + @new_order1

None.gif

END

None.gif

ELSE -- 反向检索

None.gif

BEGIN

None.gif

SET @Sql = ' SELECT TOP ' + STR ( @PageSize ) + ' ' + @FieldList + ' FROM ( '

None.gif

+ ' SELECT TOP ' + STR ( @PageSize ) + ' ' + @FieldList + ' FROM ( '

None.gif

+ ' SELECT TOP ' + STR ( @TotalCount - @PageSize * @PageIndex + @PageSize ) + ' ' + @FieldList

None.gif

+ ' FROM ' + @TableName + @new_where1 + @new_order2 + ' ) AS TMP '

None.gif

+ @new_order1 + ' ) AS TMP ' + @new_order1

None.gif

END

None.gif

END

None.gif

END

None.gif

PRINT ( @Sql )

None.gif

EXEC ( @Sql )

None.gif

GO

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读