sql server 2000的通用分页存储过程

时间:2009-12-23 09:19:20  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:p;       适用于单一主键或存在唯一值列的表或视图              */    @TableName VARCHAR(200),     --表名    @FieldList VARCHAR(2000),    --显示列名    @Primary...
  正文:

第一个支持唯一主键,第二支持多主键,测试过,效率一般

CREATE PROC P_viewPage
    /*
        no_mIss 分页存储过程 2007.2.20  QQ:34813284
        适用于单一主键或存在唯一值列的表或视图         
    */

    @TableName VARCHAR(200),     --表名
    @FieldList VARCHAR(2000),    --显示列名
    @PrimaryKey VARCHAR(100),    --单一主键或唯一值键
    @Where VARCHAR(1000),        --查询条件 不含'where'字符
    @Order VARCHAR(1000),        --排序 不含'order by'字符,如id asc,userid desc,当@SortType=3时生效
    @SortType INT,               --排序规则 1:正序asc 2:倒序desc 3:多列排序
    @RecorderCount INT,          --记录总数 0:会返回总记录
    @PageSize INT,               --每页输出的记录数
    @PageIndex INT,              --当前页数
    @TotalCount INT OUTPUT,      --返回记录总数
    @TotalPageCount INT OUTPUT   --返回总页数
AS
    SET NOCOUNT ON
    IF ISNULL(@TableName,'') = '' OR ISNULL(@FieldList,'') = ''
        OR ISNULL(@PrimaryKey,'') = ''
        OR @SortType < 1 OR @SortType >3
        OR @RecorderCount < 0 OR @PageSize < 0 OR @PageIndex < 0
    BEGIN       
        RETURN
    END
 
    DECLARE @new_where1 VARCHAR(1000)
    DECLARE @new_where2 VARCHAR(1000)
    DECLARE @new_order VARCHAR(1000)  
    DECLARE @Sql VARCHAR(8000)
    DECLARE @SqlCount NVARCHAR(4000)

    IF ISNULL(@where,'') = ''
        BEGIN
            SET @new_where1 = ' '
            SET @new_where2 = ' WHERE  '
        END
    ELSE
        BEGIN
            SET @new_where1 = ' WHERE ' + @where
            SET @new_where2 = ' WHERE ' + @where + ' AND '
        END

    IF ISNULL(@order,'') = '' OR @SortType = 1  OR @SortType = 2
        BEGIN
            IF @SortType = 1 SET @new_order = ' ORDER BY ' + @PrimaryKey + ' ASC'
            IF @SortType = 2 SET @new_order = ' ORDER BY ' + @PrimaryKey + ' DESC'
        END
    ELSE
        BEGIN
            SET @new_order = ' ORDER BY ' + @Order
        END

    SET @SqlCount = 'SELECT @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/'
                    + CAST(@PageSize AS VARCHAR)+') FROM ' + @TableName + @new_where1
   
    IF @RecorderCount = 0
        BEGIN
             EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT',
                               @TotalCount OUTPUT,@TotalPageCount OUTPUT
        END
    ELSE
        BEGIN
             SELECT @TotalCount = @RecorderCount           
        END

    IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)
        BEGIN
            SET @PageIndex =  CEILING((@TotalCount+0.0)/@PageSize)
        END
    IF @PageIndex = 1
        BEGIN
            SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
                       + @TableName + @new_where1 + @new_order
        END
    ELSE
        BEGIN
            IF @SortType = 1
                BEGIN
                    SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
                               + @TableName + @new_where2 + @PrimaryKey + ' > '
                               + '(SELECT MAX(' + @PrimaryKey + ') FROM (SELECT TOP '
                               + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey
                               + ' FROM ' + @TableName
                               + @new_where1 + @new_order +' ) AS TMP) '+ @new_order
                END
            IF @SortType = 2
                BEGIN
                    SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
                               + @TableName + @new_where2 + @PrimaryKey + ' < '
                               + '(SELECT MIN(' + @PrimaryKey + ') FROM (SELECT TOP '
                               + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey
                               +' FROM '+ @TableName
                               + @new_where1 + @new_order + ') AS TMP) '+ @new_order                              
                END      
            IF @SortType = 3
                BEGIN
                    IF CHARINDEX(',',@Order) = 0 BEGIN RETURN END
                    SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
                               + @TableName + @new_where2 + @PrimaryKey + ' NOT IN (SELECT TOP '
                               + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey
                               + ' FROM ' + @TableName + @new_where1 + @new_order + ')'
                               + @new_order
                END
        END
    EXEC(@Sql)
GO

 

CREATE PROC P_public_ViewPage_per
    /*
        no_mIss 通用分页存储过程 2007.3.1  QQ:34813284
        适用于联合主键/单主键/存在能确定唯一行列/存在能确定唯一行的多列 (用英文,隔开)
        调用:
            第一页查询时返回总记录和总页数及第一页记录:
            EXECUTE P_public_ViewPage_per 'TableName','col1,col2,col3,col4','pk1,pk2,pk3',
                'col5>0 and col7<9','pk1 asc,pk2 asc,pk3 asc',0,10,1,
                @TotalCount OUTPUT,@TotalPageCount OUTPUT
           

"sql server 2000的通用分页存储过程"由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Database/SQLServer/2009-01-07/8182.html


关键字:

关于《sql server 2000的通用分页存储过程》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td