zoukankan      html  css  js  c++  java
  • 分页存储过程收集(非本人原创)

    CREATE PROCEDURE [dbo].[P_GridViewPager] (
        @recordTotal INT OUTPUT,            --输出记录总数
        @viewName VARCHAR(800),        --表名
        @fieldName VARCHAR(800) = '*',        --查询字段
        @keyName VARCHAR(200) = 'Id',            --索引字段
        @pageSize INT = 20,                    --每页记录数
        @pageNo INT =1,                    --当前页
        @orderString VARCHAR(200),        --排序条件
        @whereString VARCHAR(800) = '1=1'        --WHERE条件
    )
    AS
    BEGIN
         DECLARE @beginRow INT
         DECLARE @endRow INT
         DECLARE @tempLimit VARCHAR(200)
         DECLARE @tempCount NVARCHAR(1000)
         DECLARE @tempMain VARCHAR(1000)
         --declare @timediff datetime 
         
         set nocount on
         --select @timediff=getdate() --记录时间
    
         SET @beginRow = (@pageNo - 1) * @pageSize    + 1
         SET @endRow = @pageNo * @pageSize
         SET @tempLimit = 'rows BETWEEN ' + CAST(@beginRow AS VARCHAR) +' AND '+CAST(@endRow AS VARCHAR)
         
         --输出参数为总记录数
         SET @tempCount = 'SELECT @recordTotal = COUNT(*) FROM (SELECT '+@keyName+' FROM '+@viewName+' WHERE '+@whereString+') AS my_temp'
         EXECUTE sp_executesql @tempCount,N'@recordTotal INT OUTPUT',@recordTotal OUTPUT
           
         --主查询返回结果集
         SET @tempMain = 'SELECT * FROM (SELECT ROW_NUMBER() OVER (order by '+@orderString+') AS rows ,'+@fieldName+' FROM '+@viewName+' WHERE '+@whereString+') AS main_temp WHERE '+@tempLimit
         
         --PRINT @tempMain
         EXECUTE (@tempMain)
         --select datediff(ms,@timediff,getdate()) as 耗时 
         
         set nocount off
    END
    
    GO
    =======================================================================================
    
    --/*-----存储过程 分页处理 SW 2005-03-28创建 -------*/
    
    --/*----- 对数据进行了2分处理使查询前半部分数据与查询后半部分数据性能相同 -------*/
    
    --/*-----存储过程 分页处理 2005-04-21修改 添加Distinct查询功能-------*/
    
    --/*-----存储过程 分页处理 2005-05-18修改 多字段排序规则问题-------*/
    
    --/*-----存储过程 分页处理 2005-06-15修改 多字段排序修改-------*/
    
    --/*-----存储过程 分页处理 2005-12-13修改 修改数据分页方式为top max模式 性能有极大提高-------*/
    
    --/*-----缺点:相对之前的not in版本主键只能是整型字段,如主键为GUID类型请使用not in 模式的版本-------*/
    
    CREATE PROCEDURE dbo.proc_ListPageInt
    
    (
    @tblName     nvarchar(200),        ----要显示的表或多个表的连接
    @fldName     nvarchar(500) = '*',    ----要显示的字段列表
    @pageSize    int = 10,        ----每页显示的记录个数
    @page        int = 1,        ----要显示那一页的记录
    @pageCount    int = 1 output,            ----查询结果分页后的总页数
    @Counts    int = 1 output,                ----查询到的记录数
    @fldSort    nvarchar(200) = null,    ----排序字段列表或条件
    @Sort        bit = 0,        ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')
    @strCondition    nvarchar(1000) = null,    ----查询条件,不需where
    @ID        nvarchar(150),        ----主表的主键
    @Dist                 bit = 0           ----是否添加查询字段的 DISTINCT 默认0不添加/1添加
    )
    AS
    SET NOCOUNT ON
    Declare @sqlTmp nvarchar(1000)        ----存放动态生成的SQL语句
    Declare @strTmp nvarchar(1000)        ----存放取得查询结果总数的查询语句
    Declare @strID     nvarchar(1000)        ----存放取得查询开头或结尾ID的查询语句
    
    Declare @strSortType nvarchar(10)    ----数据排序规则A
    Declare @strFSortType nvarchar(10)    ----数据排序规则B
    
    Declare @SqlSelect nvarchar(50)         ----对含有DISTINCT的查询进行SQL构造
    Declare @SqlCounts nvarchar(50)          ----对含有DISTINCT的总数查询进行SQL构造
    if @Dist  = 0
    begin
        set @SqlSelect = 'select '
        set @SqlCounts = 'Count(*)'
    end
    else
    begin
        set @SqlSelect = 'select distinct '
        set @SqlCounts = 'Count(DISTINCT '+@ID+')'
    end
    
    if @Sort=0
    begin
        set @strFSortType=' ASC '
        set @strSortType=' DESC '
    end
    else
    begin
        set @strFSortType=' DESC '
        set @strSortType=' ASC '
    end
    
    
    --------生成查询语句--------
    
    --此处@strTmp为取得查询结果数量的语句
    
    if @strCondition is null or @strCondition=''     --没有设置显示条件
    begin
        set @sqlTmp =  @fldName + ' From ' + @tblName
        set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName
        set @strID = ' From ' + @tblName
    end
    else
    begin
        set @sqlTmp = + @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition
        set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName + ' where (1>0) ' + @strCondition
        set @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition
    end
    
    ----取得查询结果总数量-----
    exec sp_executesql @strTmp,N'@Counts int out ',@Counts out
    declare @tmpCounts int
    if @Counts = 0
        set @tmpCounts = 1
    else
        set @tmpCounts = @Counts
    
        --取得分页总数
        set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize
        /**//**当前页大于总页数 取最后一页**/
        if @page>@pageCount
            set @page=@pageCount
    
        --/*-----数据分页2分处理-------*/
        declare @pageIndex int --总数/页大小
        declare @lastcount int --总数%页大小 
    
        set @pageIndex = @tmpCounts/@pageSize
        set @lastcount = @tmpCounts%@pageSize
        if @lastcount > 0
            set @pageIndex = @pageIndex + 1
        else
            set @lastcount = @pagesize
    
        --//***显示分页
        if @strCondition is null or @strCondition=''     --没有设置显示条件
        begin
            if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2   --前半部分数据处理
                begin 
                    if @page=1
                        set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName                        
                            +' order by '+ @fldSort +' '+ @strFSortType
                    else
                    begin                    
                        set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
                            +' where '+@ID+' <(select min('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName
                            +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)'
                            +' order by '+ @fldSort +' '+ @strFSortType
                    end    
                end
            else
                begin
                set @page = @pageIndex-@page+1 --后半部分数据处理
                    if @page <= 1 --最后一页数据显示                
                        set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName
                            +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
                    else
                        set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
                            +' where '+@ID+' >(select max('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName
                            +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)'
                            +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
                end
        end
        else --有查询条件
        begin
            if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2   --前半部分数据处理
            begin
                    if @page=1
                        set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName                        
                            +' where 1=1 ' + @strCondition + ' order by '+ @fldSort +' '+ @strFSortType
                    else
                    begin                    
                        set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
                            +' where '+@ID+' <(select min('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName
                            +' where (1=1) ' + @strCondition +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)'
                            +' '+ @strCondition +' order by '+ @fldSort +' '+ @strFSortType
                    end            
            end
            else
            begin 
                set @page = @pageIndex-@page+1 --后半部分数据处理
                if @page <= 1 --最后一页数据显示
                        set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName
                            +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType                     
                else
                        set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
                            +' where '+@ID+' >(select max('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName
                            +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)'
                            +' '+ @strCondition+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType                
            end    
        end
    
    
    ------返回查询结果-----
    exec sp_executesql @strTmp
    --print @strTmp
    SET NOCOUNT OFF
    GO
    
    
    ======================================================================
    
    DECLARE @page_size int                  --页大小
    DECLARE @page_index int                 --当前页码
    DECLARE @tables VARCHAR(512)            --表,sql中from后where前的一大串
    DECLARE @fields VARCHAR(1024)           --字段
    DECLARE @masterUniquePkid VARCHAR(32)   --用于top分页排序的依据的唯一PKID
    ---------------------------
    --示例数据
    SELECT @page_size=10
    SELECT @page_index=8
    SELECT @tables=' Productsmall p INNER join Categories c ON p.CategoryPkid=c.Pkid '
    SELECT @fields=' p.* '
    SELECT @masterUniquePkid='p.Pkid'
    ---------------------------
    
    DECLARE @record_count int --总记录数
    --SELECT @record_count = count(1) FROM Productsmall
    DECLARE @sql_record_count NVARCHAR(1000)
    SELECT @sql_record_count = N'SELECT @record_count = count(1) FROM ' + @tables 
    EXEC sp_executesql @sql_record_count,N'@record_count int output',@record_count OUTPUT
    --PRINT @record_count
    
    DECLARE @page_count int   --总页数
    SELECT @page_count = @record_count/@page_size
    
    DECLARE @top1_asc VARCHAR(8)  --第一层top,最里层top,二分法的前一半记录
    SELECT @top1_asc = cast((@page_size * @page_index) AS varchar(8))
    
    DECLARE @top1_desc VARCHAR(8) --第一层top,最里层top,二分法的后一半记录,与前一半的记录条数并不一样,要视余数多少
    --SELECT @top1_desc = cast((@record_count - (@page_index-1) * @page_size ) AS varchar(8))
    DECLARE @top1_desc_i INT 
    SELECT @top1_desc_i= @record_count - (@page_index-1) * @page_size 
    if(@top1_desc_i<0)
      select @top1_desc_i=0
    SELECT @top1_desc = cast(@top1_desc_i AS varchar(8))
    
    DECLARE @top2 VARCHAR(8) --第二层top,用于取page_size个记录
    SELECT @top2 = cast((@page_size) AS varchar(8))
    
    declare @sql varchar(3600)
    select @sql = ''
    select @sql = @sql + 'SELECT * '
    select @sql = @sql + 'FROM ( '
    select @sql = @sql + '  SELECT TOP '+ @top2 +' * ,t2Pkid = t1Pkid '--@page_size
    select @sql = @sql + '  FROM '
    select @sql = @sql + '    ( '
    
    IF(@page_index<=@page_count/2)
      select @sql = @sql + '    SELECT TOP '+ @top1_asc + @fields  + ',t1Pkid=' + @masterUniquePkid  --二分法:前一半
    ELSE
      select @sql = @sql + '    SELECT TOP '+ @top1_desc + @fields + ',t1Pkid=' + @masterUniquePkid  --二分法:后一半
    
    select @sql = @sql + '      FROM ' + @tables + ' '
    select @sql = @sql + '      WHERE 1=1 '
    
    IF(@page_index<=@page_count/2)
      select @sql = @sql + '    ORDER BY '+ @masterUniquePkid +' asc '  --二分法:前一半
    ELSE
      select @sql = @sql + '    ORDER BY '+ @masterUniquePkid +' desc ' --二分法:后一半
                                                         
    select @sql = @sql + '    ) t1 '
    
    IF(@page_index<=@page_count/2)
      select @sql = @sql + '  ORDER BY t1.t1Pkid desc '  --二分法:前一半
    ELSE
      select @sql = @sql + '  ORDER BY t1.t1Pkid asc '   --二分法:后一半
      
    select @sql = @sql + ') t2 '
    select @sql = @sql + 'ORDER BY t2.t2Pkid asc ' --CategoryPkid ASC --Pkid asc -- 实际业务逻辑中需要的排序
    
    
    PRINT @sql
    exec(@sql)
    
    go
    ========================================================================
    
    
    /*分页查找数据*/ 
    CREATE PROCEDURE [dbo].[GetRecordSet] 
    @strSql varchar(8000),--查询sql,如select * from [user] 
    @PageIndex int,--查询当页号 
    @PageSize int--每页显示记录 
    AS 
    set nocount on 
    declare @p1 int 
    declare @currentPage int 
    set @currentPage = 0 
    declare @RowCount int 
    set @RowCount = 0 
    declare @PageCount int 
    set @PageCount = 0 
    exec sp_cursoropen @p1 output,@strSql,@scrollopt=1,@ccopt=1,@rowcount=@rowCount output --得到总记录数 
    select @PageCount=ceiling(1.0*@rowCount/@pagesize) --得到总页数 
    ,@currentPage=(@PageIndex-1)*@PageSize+1 
    select @RowCount,@PageCount 
    exec sp_cursorfetch @p1,16,@currentPage,@PageSize 
    exec sp_cursorclose @p1 
    set nocount off 
    GO
    
    -- exec GetRecordSet 'select * from City',1,10
    
    =====================================================================
    
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    
    
    
    
    
    ALTER PROC [dbo].[PROCE_PageView2000]
    (
    @tbname     nvarchar(100),               --要分页显示的表名
    @FieldKey   nvarchar(1000),      --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
    @PageCurrent int=1,               --要显示的页码
    @PageSize   int=10,                --每页的大小(记录数)
    @FieldShow nvarchar(1000)='',      --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
    @FieldOrder nvarchar(1000)='',      --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
    @WhereString    nvarchar(1000)=N'',     --查询条件
    @RecordCount int OUTPUT             --总记录数
    )
    AS
    SET NOCOUNT ON
    --检查对象是否有效
    --IF OBJECT_ID(@tbname) IS NULL
    --BEGIN
    --    RAISERROR(N'对象"%s"不存在',1,16,@tbname)
    --    RETURN
    --END
    --IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
    --    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
    --    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
    --BEGIN
    --    RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
    --    RETURN
    --END
    
    --分页字段检查
    IF ISNULL(@FieldKey,N'')=''
    BEGIN
        RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
        RETURN
    END
    
    --其他参数检查及规范
    IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
    IF ISNULL(@PageSize,0)<1 SET @PageSize=10
    IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
    IF ISNULL(@FieldOrder,N'')=N''
        SET @FieldOrder=N''
    ELSE
        SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
    IF ISNULL(@WhereString,N'')=N''
        SET @WhereString=N''
    ELSE
        SET @WhereString=N'WHERE ('+@WhereString+N')'
    
    --如果@RecordCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@RecordCount赋值)
    IF @RecordCount IS NULL
    BEGIN
        DECLARE @sql nvarchar(4000)
        SET @sql=N'SELECT @RecordCount=COUNT(*)'
            +N' FROM '+@tbname
            +N' '+@WhereString
        EXEC sp_executesql @sql,N'@RecordCount int OUTPUT',@RecordCount OUTPUT
    END
    
    --计算分页显示的TOPN值
    DECLARE @TopN varchar(20),@TopN1 varchar(20)
    SELECT @TopN=@PageSize,
        @TopN1=(@PageCurrent-1)*@PageSize
    
    --第一页直接显示
    IF @PageCurrent=1
        EXEC(N'SELECT TOP '+@TopN
            +N' '+@FieldShow
            +N' FROM '+@tbname
            +N' '+@WhereString
            +N' '+@FieldOrder)
    ELSE
    BEGIN
        --处理别名
        IF @FieldShow=N'*'
            SET @FieldShow=N'a.*'
    
        --生成主键(惟一键)处理条件
        DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000),
            @s nvarchar(1000),@Field sysname
        SELECT @Where1=N'',@Where2=N'',@s=@FieldKey
        WHILE CHARINDEX(N',',@s)>0
            SELECT @Field=LEFT(@s,CHARINDEX(N',',@s)-1),
                @s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
                @Where1=@Where1+N' AND a.'+@Field+N'=b.'+@Field,
                @Where2=@Where2+N' AND b.'+@Field+N' IS NULL',
                @WhereString=REPLACE(@WhereString,@Field,N'a.'+@Field),
                @FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),
                @FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)
        SELECT @WhereString=REPLACE(@WhereString,@s,N'a.'+@s),
            @FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s),
            @FieldShow=REPLACE(@FieldShow,@s,N'a.'+@s),
            @Where1=STUFF(@Where1+N' AND a.'+@s+N'=b.'+@s,1,5,N''),    
            @Where2=CASE
                WHEN @WhereString='' THEN N'WHERE ('
                ELSE @WhereString+N' AND ('
                END+N'b.'+@s+N' IS NULL'+@Where2+N')'
    
        --执行查询
        EXEC(N'SELECT TOP '+@TopN
            +N' '+@FieldShow
            +N' FROM '+@tbname
            +N' a LEFT JOIN(SELECT TOP '+@TopN1
            +N' '+@FieldKey
            +N' FROM '+@tbname
            +N' a '+@WhereString
            +N' '+@FieldOrder
            +N')b ON '+@Where1
            +N' '+@Where2
            +N' '+@FieldOrder)
    END
    
    
    
    
    
    
     
    
    
    MSSQL2005
    
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    
    
    
    
    
    
    ALTER PROCEDURE [dbo].[PROCE_SQL2005PAGECHANGE]
    (
     @TableName varchar(50),            --表名
     @ReFieldsStr varchar(200) = '*',   --字段名(全部字段为*)
     @OrderString varchar(200),         --排序字段(必须!支持多字段不用加order by)
     @WhereString varchar(500) =N'',  --条件语句(不用加where)
     @PageSize int,                     --每页多少条记录
     @PageIndex int = 1 ,               --指定当前为第几页
     @TotalRecord int output            --返回总记录数
    )
    AS
     
    BEGIN    
    
        --处理开始点和结束点
        Declare @StartRecord int;
        Declare @EndRecord int; 
        Declare @TotalCountSql nvarchar(500); 
        Declare @SqlString nvarchar(2000);    
        set @StartRecord = (@PageIndex-1)*@PageSize + 1
        set @EndRecord = @StartRecord + @PageSize - 1 
        SET @TotalCountSql= N'select @TotalRecord = count(*) from ' + @TableName;--总记录数语句
        SET @SqlString = N'(select row_number() over (order by '+ @OrderString +') as rowId,'+@ReFieldsStr+' from '+ @TableName;--查询语句
        --
        IF (@WhereString! = '' or @WhereString!=null)
            BEGIN
                SET @TotalCountSql=@TotalCountSql + '  where '+ @WhereString;
                SET @SqlString =@SqlString+ '  where '+ @WhereString;            
            END
        --第一次执行得到
        --IF(@TotalRecord is null)
        --   BEGIN
               EXEC sp_executesql @totalCountSql,N'@TotalRecord int out',@TotalRecord output;--返回总记录数
        --  END
        ----执行主语句
        set @SqlString ='select * from ' + @SqlString + ') as t where rowId between ' + ltrim(str(@StartRecord)) + ' and ' +  ltrim(str(@EndRecord));
        Exec(@SqlString)    
    END
    
    ====================================================================
    
    
    --要分页的原始数据
    
    CREATE TABLE tb(
    
    ID    int PRIMARY KEY,  --记录编号
    
    grade  varchar(10),     --类别名称
    
    uptime datetime)        --更新时间
    
    INSERT tb SELECT 1 ,'a','2004-12-11'
    
    UNION ALL SELECT 2 ,'b','2004-12-11'
    
    UNION ALL SELECT 3 ,'c','2004-12-11'
    
    UNION ALL SELECT 4 ,'a','2004-12-12'
    
    UNION ALL SELECT 5 ,'c','2004-12-13'
    
    UNION ALL SELECT 6 ,'c','2004-12-13'
    
    UNION ALL SELECT 7 ,'a','2004-12-14'
    
    UNION ALL SELECT 8 ,'a','2004-12-15'
    
    UNION ALL SELECT 9 ,'b','2004-12-16'
    
    UNION ALL SELECT 10,'b','2004-12-17'
    
    UNION ALL SELECT 11,'a','2004-12-17'
    
     
    
    --分页定义表
    
    CREATE TABLE tb_Page(
    
    grade   varchar(10) PRIMARY KEY, --类别名称,与tb表的grade关联
    
    Records int,                     --每页显示的记录数
    
    Orders  int)                     --在页中的显示顺序
    
    INSERT tb_Page SELECT 'c',2,1
    
    UNION  ALL     SELECT 'b',1,2
    
    UNION  ALL     SELECT 'a',2,3
    
    GO
    
     
    
    --实现分页处理的存储过程
    
    CREATE PROC p_PageView
    
    @PageCurrent int=1  --要显示的当前页码
    
    AS
    
    SET NOCOUNT ON
    
    --得到每页的记录数
    
    DECLARE @PageSize int
    
    SELECT @PageSize=SUM(Records) FROM tb_Page
    
    IF ISNULL(@PageSize,0)<0 RETURN
    
     
    
    --分页显示处理
    
    SET @PageCurrent=@PageCurrent*@PageSize
    
    SET ROWCOUNT @PageCurrent
    
    SELECT SID=IDENTITY(int,1,1),ID 
    
    INTO # FROM(
    
        SELECT TOP 100 PERCENT a.ID 
    
        FROM tb a
    
            LEFT JOIN tb_Page b ON a.grade=b.grade
    
        ORDER BY CASE WHEN b.grade IS NULL THEN 1 ELSE 0 END,--分类没有定义的显示在最后
    
            ((SELECT COUNT(*) FROM tb 
    
                WHERE grade=a.grade 
    
                    AND (uptime>a.uptime OR uptime=a.uptime AND id>=a.id))-1)
    
            /b.Records,
    
            b.Orders,a.ID DESC)a
    
    IF @PageCurrent>@PageSize
    
    BEGIN
    
        SET @PageCurrent=@PageCurrent-@PageSize
    
        SET ROWCOUNT @PageCurrent
    
        DELETE FROM #
    
    END
    
    SELECT a.* FROM tb a,# b
    
    WHERE a.ID=b.ID
    
    ORDER BY b.SID
    
    GO
    
     
    
    --调用
    
    EXEC p_PageView 2
    
    /*--结果
    
    ID          grade      uptime                                                 
    
    ----------- ---------- ------------------------------------------------------ 
    
    3           c          2004-12-11 00:00:00.000
    
    9           b          2004-12-16 00:00:00.000
    
    7           a          2004-12-14 00:00:00.000
    
    4           a          2004-12-12 00:00:00.000
    
    2           b          2004-12-11 00:00:00.000
    
    --*/
    
    ==============================================================================
    
     
    set ANSI_NULLS ON 
    set QUOTED_IDENTIFIER ON 
    go 
    ALTER PROCEDURE [dbo].[proc_page] 
    ( 
    @tblName nvarchar(200), ----要显示的表或多个表的连接lihu 
    @fldName nvarchar(500) = '*', ----要显示的字段列表 
    @pageSize int = 10, ----每页显示的记录个数 
    @page int = 1, ----要显示那一页的记录 
    @fldSort nvarchar(200) = null, ----排序字段列表或条件 
    @Sort bit = 0, ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ') 
    @strCondition nvarchar(1000), ----查询条件,不需where 
    @ID nvarchar(150), ----主表的主键 
    @Dist bit = 0, ----是否添加查询字段的 DISTINCT 默认0不添加/1添加 
    @pageCount int = 1 output, ----查询结果分页后的总页数 
    @Counts int = 1 output ----查询到的记录数 
    ) 
    AS 
    SET NOCOUNT ON 
    Declare @sqlTmp nvarchar(1000) ----存放动态生成的SQL语句 
    Declare @strTmp nvarchar(1000) ----存放取得查询结果总数的查询语句 
    Declare @strID nvarchar(1000) ----存放取得查询开头或结尾ID的查询语句 
    Declare @strSortType nvarchar(10) ----数据排序规则A 
    Declare @strFSortType nvarchar(10) ----数据排序规则B 
    Declare @SqlSelect nvarchar(50) ----对含有DISTINCT的查询进行SQL构造 
    Declare @SqlCounts nvarchar(50) ----对含有DISTINCT的总数查询进行SQL构造 
    declare @timediff datetime --耗时测试时间差 
    select @timediff=getdate() 
    if @Dist = 0 
    begin 
    set @SqlSelect = 'select ' 
    set @SqlCounts = 'Count(*)' 
    end 
    else 
    begin 
    set @SqlSelect = 'select distinct ' 
    set @SqlCounts = 'Count(DISTINCT '+@ID+')' 
    end 
    if @Sort=0 
    begin 
    set @strFSortType=' ASC ' 
    set @strSortType=' DESC ' 
    end 
    else 
    begin 
    set @strFSortType=' DESC ' 
    set @strSortType=' ASC ' 
    end 
    --------生成查询语句-------- 
    --此处@strTmp为取得查询结果数量的语句 
    if @strCondition is null or @strCondition='' --没有设置显示条件 
    begin 
    set @sqlTmp = @fldName + ' From ' + @tblName 
    set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName 
    set @strID = ' From ' + @tblName 
    end 
    else 
    begin 
    set @sqlTmp = + @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition 
    set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName + ' where (1>0) ' + @strCondition 
    set @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition 
    end 
    ----取得查询结果总数量----- 
    exec sp_executesql @strTmp,N'@Counts int out ',@Counts out 
    declare @tmpCounts int 
    if @Counts = 0 
    set @tmpCounts = 1 
    else 
    set @tmpCounts = @Counts 
    --取得分页总数 
    set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize 
    /**当前页大于总页数 取最后一页**/ 
    if 2>@pageCount 
    set 2=@pageCount 
    --/*-----数据分页2分处理-------*/ 
    declare @pageIndex int --总数/页大小 
    declare @lastcount int --总数%页大小 
    set @pageIndex = @tmpCounts/@pageSize 
    set @lastcount = @tmpCounts%@pageSize 
    if @lastcount > 0 
    set @pageIndex = @pageIndex + 1 
    else 
    set @lastcount = @pagesize 
    --//***显示分页 
    if @strCondition is null or @strCondition='' --没有设置显示条件 
    begin 
    if @pageIndex<2 or 2<=@pageIndex / 2 + @pageIndex % 2 --前半部分数据处理 
    begin 
    if 2=1 
    set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    +' order by '+ @fldSort +' '+ @strFSortType 
    else 
    begin 
    if @Sort=1 
    begin 
    set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    +' where '+@ID+' <(select min('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(2-1) as Varchar(20)) +' '+ @ID +' from '+@tblName 
    +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' 
    +' order by '+ @fldSort +' '+ @strFSortType 
    end 
    else 
    begin 
    set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    +' where '+@ID+' >(select max('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(2-1) as Varchar(20)) +' '+ @ID +' from '+@tblName 
    +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' 
    +' order by '+ @fldSort +' '+ @strFSortType 
    end 
    end 
    end 
    else 
    begin 
    set 2= @pageIndex-2+1 --后半部分数据处理 
    if 2<= 1 --最后一页数据显示 
    set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
    else 
    if @Sort=1 
    begin 
    set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    +' where '+@ID+' >(select max('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(2-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName 
    +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' 
    +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
    end 
    else 
    begin 
    set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    +' where '+@ID+' <(select min('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(2-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName 
    +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' 
    +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
    end 
    end 
    end 
    else --有查询条件 
    begin 
    if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分数据处理 
    begin 
    if @page=1 
    set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    +' where 1=1 ' + @strCondition + ' order by '+ @fldSort +' '+ @strFSortType 
    else if(@Sort=1) 
    begin 
    set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    +' where '+@ID+' <(select min('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName 
    +' where (1=1) ' + @strCondition +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' 
    +' '+ @strCondition +' order by '+ @fldSort +' '+ @strFSortType 
    end 
    else 
    begin 
    set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    +' where '+@ID+' >(select max('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName 
    +' where (1=1) ' + @strCondition +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' 
    +' '+ @strCondition +' order by '+ @fldSort +' '+ @strFSortType 
    end 
    end 
    else 
    begin 
    set 2= @pageIndex-2+1 --后半部分数据处理 
    if 2<= 1 --最后一页数据显示 
    set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
    else if(@Sort=1) 
    set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    +' where '+@ID+' >(select max('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName 
    +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' 
    +' '+ @strCondition+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
    else 
    set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    +' where '+@ID+' <(select min('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName 
    +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' 
    +' '+ @strCondition+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
    end 
    end 
    ------返回查询结果----- 
    exec sp_executesql @strTmp 
    select datediff(ms,@timediff,getdate()) as 耗时 
    print @strTmp 
    SET NOCOUNT OFF 
    
    ===============================================================
    
     
    Create PROC 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 (Select * FROM ' + @TableName + @new_where1+') AS T' 
    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 * FROM (Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ' 
    + @TableName + @new_where1 + @new_order1 +') AS TMP ' + @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) 
    
    
    
    
    ==========================================================
    
     
    USE [CaiLi] 
    GO 
    /****** Object: StoredProcedure [dbo].[SqlPagination] Script Date: 10/26/2011 11:40:46 ******/ 
    SET ANSI_NULLS ON 
    GO 
    SET QUOTED_IDENTIFIER ON 
    GO 
    CREATE PROCEDURE [dbo].[SqlPagination] 
    /* 
    *************************************************************** 
    ** 千万数量级分页存储过程 ** 
    *************************************************************** 
    参数说明: 
    1.Tables :表名称,视图 
    2.PrimaryKey :主关键字 
    3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc 
    4.CurrentPage :当前页码 
    5.PageSize :分页尺寸 
    6.Filter :过滤语句,不带Where 
    7.Group :Group语句,不带Group By 
    ***************************************************************/ 
    ( 
    @Tables varchar(1000), 
    @PrimaryKey varchar(100), 
    @Sort varchar(200) = NULL, 
    @CurrentPage int = 1, 
    @PageSize int = 10, 
    @Fields varchar(1000) = '*', 
    @Filter varchar(1000) = NULL, 
    @Group varchar(1000) = NULL 
    ) 
    AS 
    /*默认排序*/ 
    if @PrimaryKey IS NULL or @PrimaryKey = '' 
    set @PrimaryKey='ID' 
    IF @Sort IS NULL or @Sort = '' 
    SET @Sort = @PrimaryKey 
    IF @Fields IS NULL or @Fields = '' 
    SET @Fields = '*' 
    DECLARE @SortTable varchar(100) 
    DECLARE @SortName varchar(100) 
    DECLARE @strSortColumn varchar(200) 
    DECLARE @operator char(2) 
    DECLARE @type varchar(100) 
    DECLARE @prec int 
    /*设定排序语句.*/ 
    if charindex(',',@Sort) >0 
    set @strSortColumn = substring(@Sort,0,charindex(',',@Sort)) 
    else 
    set @strSortColumn = @Sort 
    IF CHARINDEX('DESC',@Sort)>0 
    BEGIN 
    SET @strSortColumn = REPLACE(@strSortColumn, 'DESC', '') 
    SET @operator = '<=' 
    END 
    ELSE 
    BEGIN 
    IF CHARINDEX('ASC',@Sort)> 0 
    BEGIN 
    SET @strSortColumn = REPLACE(@strSortColumn, 'ASC', '') 
    SET @operator = '>=' 
    END 
    END 
    IF CHARINDEX('.', @strSortColumn) > 0 
    BEGIN 
    SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn)) 
    SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn)) 
    END 
    ELSE 
    BEGIN 
    SET @SortTable = @Tables 
    SET @SortName = @strSortColumn 
    END 
    Select @type=t.name, @prec=c.prec 
    FROM sysobjects o 
    JOIN syscolumns c on o.id=c.id 
    JOIN systypes t on c.xusertype=t.xusertype 
    Where o.name = @SortTable AND c.name = @SortName 
    IF CHARINDEX('char', @type) > 0 
    SET @type = @type + '(' + CAST(@prec AS varchar) + ')' 
    DECLARE @strPageSize varchar(50) 
    DECLARE @strStartRow varchar(50) 
    DECLARE @strFilter varchar(1000) 
    DECLARE @strSimpleFilter varchar(1000) 
    DECLARE @strGroup varchar(1000) 
    DECLARE @strSort varchar(200) 
    /*默认当前页*/ 
    IF @CurrentPage < 1 
    SET @CurrentPage = 1 
    /*设置分页参数.*/ 
    SET @strPageSize = CAST(@PageSize AS varchar(50)) 
    SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1) AS varchar(50)) 
    /*筛选以及分组语句.*/ 
    IF @Filter IS NOT NULL AND @Filter != '' 
    BEGIN 
    SET @strFilter = ' Where 1=1 ' + @Filter + ' ' 
    SET @strSimpleFilter =@Filter + ' ' 
    END 
    ELSE 
    BEGIN 
    SET @strSimpleFilter = '' 
    SET @strFilter = '' 
    END 
    IF @Group IS NOT NULL AND @Group != '' 
    SET @strGroup = ' GROUP BY ' + @Group + ' ' 
    ELSE 
    SET @strGroup = '' 
    IF @Sort IS NOT NULL AND @Sort != '' 
    SET @strSort = ' ORDER BY ' + @Sort + ' ' 
    ELSE 
    SET @strSort = '' 
    --print('Select ' + @Fields + ' FROM ' + '(Select *,ROW_NUMBER() OVER ('+@strSort+')as RowNumber FROM '+@Tables+') t' + ' Where t.RowNumber between '+@strStartRow+' and '+' ' + @strSimpleFilter + ' ' + @strSort + @strGroup) 
    /*执行查询语句*/ 
    declare @STRORDER varchar(50) 
    if CHARINDEX(',',@strSort)>0 
    set @STRORDER=SUBSTRING(@strSort, 0, CHARINDEX(',',@strSort)) 
    else 
    set @STRORDER=@strSort 
    EXEC( 
    ' DECLARE @SortColumn ' + @type + ' 
    DECLARE @TotalCount int 
    DECLARE @ENDCOUNT int 
    DECLARE @strENDCOUNT varchar(50) 
    --Select count(1) FROM ' + @Tables + @strFilter+' 
    set @TotalCount=(Select count(1) FROM ' + @Tables + @strFilter+')'+' 
    SET ROWCOUNT ' + @strStartRow + ' 
    SET @ENDCOUNT=CAST('+@strStartRow+' AS int)+CAST('+@strPageSize+' AS int)-1 
    IF @ENDCOUNT > @TotalCount 
    BEGIN 
    SET @ENDCOUNT = @TotalCount 
    END 
    set @strENDCOUNT=CAST(@ENDCOUNT AS varchar(50)) 
    Select @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + @strSort + ' 
    SET ROWCOUNT ' + @strPageSize + ' 
    Select ' + @Fields + ' FROM ' + '(Select *,ROW_NUMBER() OVER ('+@STRORDER+')as RowNumber FROM '+@Tables+' where 1=1 '+@strSimpleFilter+') t' + ' Where t.RowNumber between '+@strStartRow+' and @strENDCOUNT ' + @strGroup + @strSort + ' ') 
    GO 
    
    =====================================================================
    
    ------"我"认为比较好的分页存储过程
    
    create PROCEDURE Sp_Conn_Sort
    (
    @tblName   varchar(255),       -- 表名
    
    @strGetFields varchar(1000) = '*',  -- 需要返回的列
    
    @fldName varchar(255)='',      -- 排序的字段名
    
    @PageSize   int = 40,          -- 页尺寸
    
    @PageIndex  int = 1,           -- 页码
    
    @doCount  bit = 0,   -- 返回记录总数, 非 0 值则返回
    
    @OrderType bit = 0,  -- 设置排序类型, 非 0 值则降序
    @strWhere  varchar(1500)=''  -- 查询条件 (注意: 不要加 where)
    )
    AS
    
    declare @strSQL   varchar(5000)       -- 主语句
    
    declare @strTmp   varchar(110)        -- 临时变量
    
    declare @strOrder varchar(400)        -- 排序类型
    
     
    
    if @doCount != 0
    
      begin
    
        if @strWhere !=''
    
        set @strSQL = 'select count(*) as Total from ' + @tblName + ' where '+@strWhere
    
        else
    
        set @strSQL = 'select count(*) as Total from ' + @tblName
    
    end 
    
    --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
    
    else
    
    begin
    
     
    
    if @OrderType != 0
    
    begin
    
        set @strTmp = '<(select min'
    
    set @strOrder = ' order by ' + @fldName +' desc'
    
    --如果@OrderType不是0,就执行降序,这句很重要!
    
    end
    
    else
    
    begin
    
        set @strTmp = '>(select max'
    
        set @strOrder = ' order by ' + @fldName +' asc'
    
    end
    
     
    
    if @PageIndex = 1
    
    begin
    
        if @strWhere != ''  
    
        set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder
    
         else
    
         set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from '+ @tblName + ' '+ @strOrder
    
    --如果是第一页就执行以上代码,这样会加快执行速度
    
    end
    
    else
    
    begin
    
    --以下代码赋予了@strSQL以真正执行的SQL代码
    
    set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from '
    
        + @tblName + ' where ' + @fldName + '' + @strTmp + '('+ @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '+ @fldName + ' from ' + @tblName + '' + @strOrder + ') as tblTmp)'+ @strOrder
    
     
    
    if @strWhere != ''
    
        set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from '
    
            + @tblName + ' where ' + @fldName + '' + @strTmp + '('
    
            + @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '
    
            + @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '
    
            + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
    
    end
    
    end  
    
    exec (@strSQL)
    
    -----------------
    ---sql server 2000 单主键高效分页存储过程 (支持多字段排序)
    ----------------------
    Create PROC 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 (Select * FROM ' + @TableName + @new_where1+') AS T'          
        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 * FROM (Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '          
                        + @TableName + @new_where1 + @new_order1 +') AS TMP ' + @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)
        
        
        
    ==============================================================
    
    * Code formatted by SoftTree SQL Assistant ?v5.0.97
     * Time: 2011-10-05 21:40:08
     ************************************************************/
    
    CREATE PROCEDURE PAGE01
        @tblName VARCHAR(255), -- 表名
        @strGetFields VARCHAR(1000) = '*', -- 需要返回的列
        @fldName VARCHAR(255) = '', -- 排序的字段名
        @PageSize INT = 10, -- 页尺寸
        @PageIndex INT = 1, -- 页码
        @doCount BIT = 0, -- 返回记录总数, 非 0 值则返回
        @OrderType BIT = 0, -- 设置排序类型, 非 0 值则降序
        @strWhere VARCHAR(1500) = '''' -- 查询条件 (注意: 不要加 where)
    AS
        DECLARE @strSQL    VARCHAR(5000) -- 主语句
        DECLARE @strTmp    VARCHAR(110) -- 临时变量
        DECLARE @strOrder  VARCHAR(400) -- 排序类型
        IF @doCount != 0
        BEGIN
            IF @strWhere != ''''
                SET @strSQL = 'select count(*) as Total from' + ' ' + @tblName + 
                    ' where' + @strWhere
            ELSE
                SET @strSQL = 'select count(*) as Total from ' + @tblName
        END--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况:
        ELSE
        BEGIN
            IF @OrderType != 0
            BEGIN
                SET @strTmp = '<(select min'
                SET @strOrder = ' order by ' + @fldName + ' desc'
                    --如果@OrderType不是0,就执行降序,这句很重要!
            END
            ELSE
            BEGIN
                SET @strTmp = '>(select max'
                SET @strOrder = ' order by ' + @fldName + ' asc'
            END
            IF @PageIndex = 1
            BEGIN
                IF @strWhere != ''''
                    SET @strSQL = 'select top ' + STR(@PageSize) + ' ' + @strGetFields
                        + '
                     from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder
                ELSE
                    SET @strSQL = 'select top ' + STR(@PageSize) + ' ' + @strGetFields
                        + ' 
               from ' + @tblName + ' ' + @strOrder
                        --如果是第一页就执行以上代码,这样会加快执行速度
            END
            ELSE
            BEGIN
                --以下代码赋予了@strSQL以真正执行的SQL代码 
                SET @strSQL = 'select top ' + STR(@PageSize) + ' ' + @strGetFields + 
                    ' from '
                    + @tblName + ' where ' + @fldName + '' + @strTmp + '(' + @fldName 
                    + ') 
              from (select top ' + STR((@PageIndex -1) * @PageSize) + ' ' + @fldName 
                    + ' 
              from ' + @tblName + '' + @strOrder + ') as tblTmp)' + @strOrder
                
                IF @strWhere != ''''
                    SET @strSQL = 'select top ' + STR(@PageSize) + ' ' + @strGetFields
                        + ' from ['
                        + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
                        + @fldName + ']) from (select top ' + STR((@PageIndex -1) * @PageSize) 
                        + ' ['
                        + @fldName + '] from [' + @tblName + '] where ' + @strWhere 
                        + ' '
                        + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
            END
        END 
        EXEC (@strSQL)
    GO
    
    
     -------PAGE01 'tt','*','id'
     
     
     ============================================
     
     
     
     /************************************************************
     * Code formatted by SoftTree SQL Assistant ?v5.0.97
     * Time: 2011-10-05 21:35:12
     ************************************************************/
    
    CREATE PROCEDURE PAGE1_tt
        @tblName VARCHAR(255), -- 表名
        @strGetFields VARCHAR(1000) = '*', -- 需要返回的列
        @fldName VARCHAR(255) = '', -- 排序的字段名
        @PageSize INT = 10, -- 页尺寸
        @PageIndex INT = 1, -- 页码
        @doCount BIT = 0, -- 返回记录总数, 非 0 值则返回
        @OrderType BIT = 0, -- 设置排序类型, 非 0 值则降序
        @strWhere VARCHAR(1500) = '''' -- 查询条件 (注意: 不要加 where)
    AS
        DECLARE @strSQL    VARCHAR(5000) -- 主语句
        DECLARE @strTmp    VARCHAR(110) -- 临时变量
        DECLARE @strOrder  VARCHAR(400) -- 排序类型
        IF @doCount != 0
        BEGIN
            IF @strWhere != ''''
                SET @strSQL = 'select count(*) as Total from' + ' ' + @tblName + 
                    ' where' + @strWhere
            ELSE
                SET @strSQL = 'select count(*) as Total from ' + @tblName
        END--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况:
        ELSE
        BEGIN
            IF @OrderType != 0
            BEGIN
                SET @strTmp = '<(select min'
                SET @strOrder = ' order by ' + @fldName + ' desc'
                    --如果@OrderType不是0,就执行降序,这句很重要!
            END
            ELSE
            BEGIN
                SET @strTmp = '>(select max'
                SET @strOrder = ' order by ' + @fldName + ' asc'
            END
            IF @PageIndex = 1
            BEGIN
                IF @strWhere != ''''
                    SET @strSQL = 'select top ' + STR(@PageSize) + ' ' + @strGetFields
                        + '
                     from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder
                ELSE
                    SET @strSQL = 'select top ' + STR(@PageSize) + ' ' + @strGetFields
                        + ' 
               from ' + @tblName + ' ' + @strOrder
                        --如果是第一页就执行以上代码,这样会加快执行速度
            END
            ELSE
            BEGIN
                --以下代码赋予了@strSQL以真正执行的SQL代码 
                SET @strSQL = 'select top ' + STR(@PageSize) + ' ' + @strGetFields + 
                    ' from '
                    + @tblName + ' where ' + @fldName + '' + @strTmp + '(' + @fldName 
                    + ') 
              from (select top ' + STR((@PageIndex -1) * @PageSize) + ' ' + @fldName 
                    + ' 
              from ' + @tblName + '' + @strOrder + ') as tblTmp)' + @strOrder
                
                IF @strWhere != ''''
                    SET @strSQL = 'select top ' + STR(@PageSize) + ' ' + @strGetFields
                        + ' from ['
                        + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
                        + @fldName + ']) from (select top ' + STR((@PageIndex -1) * @PageSize) 
                        + ' ['
                        + @fldName + '] from [' + @tblName + '] where ' + @strWhere 
                        + ' '
                        + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
            END
        END 
        EXEC (@strSQL)
        GO
    
     --PAGE1_tt   'tt','*','id',100,1,0
    
  • 相关阅读:
    Elasticsearch Query DSL 整理总结(三)—— Match Phrase Query 和 Match Phrase Prefix Query
    Elasticsearch Query DSL 整理总结(二)—— 要搞懂 Match Query,看这篇就够了
    Elasticsearch Query DSL 整理总结(一)—— Query DSL 概要,MatchAllQuery,全文查询简述
    Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries
    Elasticsearch date 类型详解
    python 历险记(五)— python 中的模块
    python 历险记(四)— python 中常用的 json 操作
    python 历险记(三)— python 的常用文件操作
    Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI
    Elasticsearch Java Rest Client API 整理总结 (一)——Document API
  • 原文地址:https://www.cnblogs.com/ssqhan/p/4960380.html
Copyright © 2011-2022 走看看