zoukankan      html  css  js  c++  java
  • SQL Server 2008 通用分页存储过程

    1.alert

    USE [数据库名称]
     GO
     /****** Object:  StoredProcedure [dbo].[dbTab_PagerHelper]    Script Date: 08/22/2010 13:30:39 ******/
     SET ANSI_NULLS ON
     GO
     SET QUOTED_IDENTIFIER ON
     GO
     -- =============================================
     -- Author:    Jarry
     -- Create date: 2009-08-01
     -- Description:    通用分页存储过程
     -- =============================================
     ALTER PROCEDURE [dbo].[dbTab_PagerHelper] 
         @TableName VARCHAR(50), --表名
         @FieldNames VARCHAR(1000), --显示列名,如果是全部字段则为*
         @WhereString VARCHAR(256) = NULL, --查询条件 不含'WHERE'字符,如[id]>5 AND [userid]>10000
         @OrderField VARCHAR(256) = NULL, --排序不含'ORDER BY'字符,当@SortType=3时生效,必须指定ASC或DESC,建议在最后加上主键
         @OrderType TINYINT, --排序规则(1:单列正序ASC;2:单列倒序DESC;3:多列排序;)
         @PageIndex INT, --当前页数
         @PageSize INT, --每页输出的记录数
         @RecorderCount INT = 0 --记录总数,如果小于等于0则重新统计总数
     AS
     BEGIN
         SET NOCOUNT ON;
         DECLARE @LowerBound int, @UpperBound int;
         SET @LowerBound = (@PageSize * (@PageIndex - 1));
         SET @UpperBound = (@LowerBound + @PageSize - 1);
         DECLARE @MSSQL NVARCHAR(3000), @Where NVARCHAR(500), @Order VARCHAR(256), @Order2 VARCHAR(256);
         SET @MSSQL = '';
         SET @Where = '';
         SET @Order = '';
         SET @Order2 = '';
         IF((@WhereString IS NOT NULL) AND (@WhereString != '')) 
             SET @Where = ' WHERE ' + @WhereString;
         IF((@OrderType IS NOT NULL) AND (@OrderType > 0))
         BEGIN
             SET @Order = ' ORDER BY ' + @OrderField;
             IF(@OrderType = 1)
                 SET @Order = @Order + ' ASC';
             ELSE IF(@OrderType = 2)
                 SET @Order = @Order + ' DESC';
             SET @Order2 = REPLACE(REPLACE(UPPER(@Order), ' ASC', ' {ASC}'), ' DESC', ' {DESC}');
             SET @Order2 = REPLACE(REPLACE(UPPER(@Order2), ' {ASC}', ' DESC'), ' {DESC}', ' ASC');
         END
         
         --重新统计总记录数
         IF(@RecorderCount <= 0)
             EXECUTE('SELECT COUNT(*) AS [RecorderCount] FROM ' + @TableName + @Where);
         ELSE
             SELECT @RecorderCount AS [RecorderCount];
         
         IF(@PageIndex <= 1) --如果是第一页
         BEGIN
             SET @MSSQL = 'SELECT TOP ' + STR(@PageSize) +' '+ @FieldNames + ' FROM ' + @TableName + @Where + @Order;
         END
         ELSE IF((@PageSize*@PageIndex) >= @RecorderCount) --如果是最后一页
         BEGIN
             SET @MSSQL = 'SELECT ' + @FieldNames + ' FROM (SELECT TOP ' + STR(@PageSize - ((@PageSize*@PageIndex) - @RecorderCount)) + ' ' + @FieldNames + ' FROM ' + @TableName + @Where + @Order2 + ') AS [PagerTempTable]' + @Order;
         END
         ELSE
         BEGIN
             IF(@OrderType < 3) --单列排序分页方法
             BEGIN
                 SET @MSSQL = 'SELECT TOP ' + STR(@PageSize);
                 SET @MSSQL = @MSSQL + ' ' + @FieldNames;
                 SET @MSSQL = @MSSQL + ' FROM ' + @TableName;
                 SET @MSSQL = @MSSQL + @Where;
                 DECLARE @TempStrings NVARCHAR(500);
                 SET @TempStrings = '';
                 IF(@OrderType > 0)
                 BEGIN
                     IF(@Where <> '')
                         SET @TempStrings = @TempStrings + ' AND';
                     ELSE
                         SET @TempStrings = ' WHERE ';
                     SET @TempStrings = @TempStrings + ' ' + @OrderField;
                     
                     IF(@OrderType = 1)
                     BEGIN
                         SET @TempStrings = @TempStrings + ' > (SELECT MAX';
                     END
                     ELSE
                     BEGIN
                         SET @TempStrings = @TempStrings + ' < (SELECT MIN';
                     END
                     SET @TempStrings = @TempStrings + '(' + @OrderField + ') FROM (SELECT TOP '+STR(@LowerBound)+' ' + @OrderField + ' FROM ' + @TableName + @Where + @Order;
                     SET @TempStrings = @TempStrings + ') AS [PagerTempTable])';
                     
                 END
                 SET @MSSQL = @MSSQL + @TempStrings + @Order;
             END
             ELSE --多列排序分页方法
             BEGIN
                 SET @MSSQL = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldNames + ' FROM (SELECT TOP ' + STR(@PageSize) + ' ' + @FieldNames + ' FROM (SELECT TOP ' + STR(@PageSize*@PageIndex) + ' ' + @FieldNames + ' FROM ' + @TableName + @Where + @Order + ') AS [PagerTempTable]' + @Order2 + ') AS [PagerTempTable]' + @Order + ';'
             END
         END
         EXECUTE(@MSSQL);
     END

    2.create

    USE [数据库名]
    GO
    
    /****** Object:  StoredProcedure [dbo].[P_viewPage]    Script Date: 03/30/2016 15:16:06 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    
    
    CREATE PROC [dbo].[P_viewPage]
    
        /**//*
            nzperfect [no_mIss] 高效通用分页存储过程(双向检索) 2007.5.7  QQ:34813284
            敬告:适用于单一主键或存在唯一值列的表或视图
            ps:Sql语句为8000字节,调用时请注意传入参数及sql总长度不要超过指定范围
               
        */
    
        @TableName VARCHAR(200),     --表名
        @FieldList VARCHAR(2000),    --显示列名,如果是全部字段则为*
        @PrimaryKey VARCHAR(100),    --单一主键或唯一值键
        @Where VARCHAR(2000),        --查询条件 不含'where'字符,如id>10 and len(userid)>9
        @Order VARCHAR(1000),        --排序 不含'order by'字符,如id asc,userid desc,必须指定asc或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(@TotalCount,'') = '' SET @TotalCount = 0
        SET @Order = RTRIM(LTRIM(@Order))
        SET @PrimaryKey = RTRIM(LTRIM(@PrimaryKey))
        SET @FieldList = REPLACE(RTRIM(LTRIM(@FieldList)),' ','')
    
        WHILE CHARINDEX(', ',@Order) > 0 OR CHARINDEX(' ,',@Order) > 0
        BEGIN
            SET @Order = REPLACE(@Order,', ',',')
            SET @Order = REPLACE(@Order,' ,',',')    
        END
    
        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 
            PRINT('ERR_00')       
            RETURN
        END    
    
        IF @SortType = 3
        BEGIN
            IF (UPPER(RIGHT(@Order,4))!=' ASC' AND UPPER(RIGHT(@Order,5))!=' DESC')
            BEGIN PRINT('ERR_02') RETURN END
        END
    
        DECLARE @new_where1 VARCHAR(1000)
        DECLARE @new_where2 VARCHAR(1000)
        DECLARE @new_order1 VARCHAR(1000)   
        DECLARE @new_order2 VARCHAR(1000)
        DECLARE @new_order3 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 
                BEGIN 
                    SET @new_order1 = ' ORDER BY ' + @PrimaryKey + ' ASC'
                    SET @new_order2 = ' ORDER BY ' + @PrimaryKey + ' DESC'
                END
                IF @SortType = 2 
                BEGIN 
                    SET @new_order1 = ' ORDER BY ' + @PrimaryKey + ' DESC'
                    SET @new_order2 = ' ORDER BY ' + @PrimaryKey + ' ASC'
                END
            END
        ELSE
            BEGIN
                SET @new_order1 = ' ORDER BY ' + @Order
            END
    
        IF @SortType = 3 AND  CHARINDEX(','+@PrimaryKey+' ',','+@Order)>0
            BEGIN
                SET @new_order1 = ' ORDER BY ' + @Order
                SET @new_order2 = @Order + ','            
                SET @new_order2 = REPLACE(REPLACE(@new_order2,'ASC,','{ASC},'),'DESC,','{DESC},')            
                SET @new_order2 = REPLACE(REPLACE(@new_order2,'{ASC},','DESC,'),'{DESC},','ASC,')
                SET @new_order2 = ' ORDER BY ' + SUBSTRING(@new_order2,1,LEN(@new_order2)-1)            
                IF @FieldList <> '*'
                    BEGIN            
                        SET @new_order3 = REPLACE(REPLACE(@Order + ',','ASC,',','),'DESC,',',')                              
                        SET @FieldList = ',' + @FieldList                    
                        WHILE CHARINDEX(',',@new_order3)>0
                        BEGIN
                            IF CHARINDEX(SUBSTRING(','+@new_order3,1,CHARINDEX(',',@new_order3)),','+@FieldList+',')>0
                            BEGIN 
                            SET @FieldList = 
                                @FieldList + ',' + SUBSTRING(@new_order3,1,CHARINDEX(',',@new_order3))                        
                            END
                            SET @new_order3 = 
                            SUBSTRING(@new_order3,CHARINDEX(',',@new_order3)+1,LEN(@new_order3))
                        END
                        SET @FieldList = SUBSTRING(@FieldList,2,LEN(@FieldList))                     
                    END            
            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 OR @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize)
            BEGIN
                IF @PageIndex = 1 --返回第一页数据
                    BEGIN
                        SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ' 
                                   + @TableName + @new_where1 + @new_order1
                    END
                IF @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize)  --返回最后一页数据
                    BEGIN
                        SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM (' 
                                   + 'SELECT TOP ' + STR(ABS(@PageSize*@PageIndex-@TotalCount-@PageSize)) 
                                   + ' ' + @FieldList + ' FROM '
                                   + @TableName + @new_where1 + @new_order2 + ' ) AS TMP '
                                   + @new_order1                    
                    END        
            END    
        ELSE
            BEGIN
                IF @SortType = 1  --仅主键正序排序
                    BEGIN
                        IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索
                            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_order1 +' ) AS TMP) '+ @new_order1
                            END
                        ELSE  --反向检索
                            BEGIN
                                SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM (' 
                                           + 'SELECT TOP ' + STR(@PageSize) + ' ' 
                                           + @FieldList + ' FROM '
                                           + @TableName + @new_where2 + @PrimaryKey + ' < '
                                           + '(SELECT MIN(' + @PrimaryKey + ') FROM (SELECT TOP '
                                           + STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey 
                                           + ' FROM ' + @TableName
                                           + @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2 
                                           + ' ) AS TMP ' + @new_order1
                            END
                    END
                IF @SortType = 2  --仅主键反序排序
                    BEGIN
                        IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/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_order1 + ') AS TMP) '+ @new_order1                               
                            END 
                        ELSE  --反向检索
                            BEGIN
                                SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM (' 
                                           + 'SELECT TOP ' + STR(@PageSize) + ' ' 
                                           + @FieldList + ' FROM '
                                           + @TableName + @new_where2 + @PrimaryKey + ' > '
                                           + '(SELECT MAX(' + @PrimaryKey + ') FROM (SELECT TOP '
                                           + STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey 
                                           + ' FROM ' + @TableName
                                           + @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2 
                                           + ' ) AS TMP ' + @new_order1
                            END  
                    END                         
                IF @SortType = 3  --多列排序,必须包含主键,且放置最后,否则不处理
                    BEGIN
                        IF CHARINDEX(',' + @PrimaryKey + ' ',',' + @Order) = 0 
                        BEGIN PRINT('ERR_02') RETURN END
                        IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索
                            BEGIN
                                SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '
                                           + 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '
                                           + ' SELECT TOP ' + STR(@PageSize*@PageIndex) + ' ' + @FieldList
                                           + ' FROM ' + @TableName + @new_where1 + @new_order1 + ' ) AS TMP '
                                           + @new_order2 + ' ) AS TMP ' + @new_order1    
                            END
                        ELSE  --反向检索
                            BEGIN
                                SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '  
                                           + 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '
                                           + ' SELECT TOP ' + STR(@TotalCount-@PageSize*@PageIndex+@PageSize) + ' ' + @FieldList
                                           + ' FROM ' + @TableName + @new_where1 + @new_order2 + ' ) AS TMP '
                                           + @new_order1 + ' ) AS TMP ' + @new_order1
                            END
                    END
            END
        PRINT(@Sql)
        EXEC(@Sql)
    
    
    
    GO
  • 相关阅读:
    (2.3)备份与还原--事务的运行模式与处理机制
    (2.2)备份与还原--备份类型与恢复模式、备份介质
    (2.1)备份与还原--sql server文件的概念及操作
    (1.3.3)权限控制
    (1.3.2)登录验证(加密连接与登录验证)
    (1.3.1)连接安全(连接实例与网络协议及TDS端点)
    static class
    cnblog
    microsoft
    C# socket android
  • 原文地址:https://www.cnblogs.com/bosamvs/p/6072650.html
Copyright © 2011-2022 走看看