zoukankan      html  css  js  c++  java
  • 专用于SqlServer2005的高效分页存储过程(支持多字段任意排序,不要求排序字段唯一)

    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    
    
    
    -- =============================================powered by 25175.net
    -- Author:        <杨俊明>
    -- Create date: <2006-11-05>
    -- Description:    <高效分页存储过程,仅适用于Sql2005>
    -- Notes:        <排序字段强烈建议建索引>
    -- =============================================
    --Alter Procedure [dbo].[up_Page2005] 
    alter proc up_Page_2005
     @TableName varchar(50),        --表名
     @Fields varchar(5000) = '*',    --字段名(全部字段为*)
     @OrderField varchar(5000),        --排序字段(必须!支持多字段)
     @sqlWhere varchar(5000) = Null,--条件语句(不用加where)
     @pageSize int,                    --每页多少条记录
     @pageIndex int = 1 ,            --指定当前为第几页
     @TotalPage int output            --返回总页数 
    as
    begin
    
        Begin Tran --开始事务
    
        Declare @sql nvarchar(4000);
        Declare @totalRecord int;    
    
        --计算总记录数
             
        if (@sqlWhere='' or @sqlWhere=NULL)
            set @sql = 'select @totalRecord = count(1) from ' + @TableName
        else
            set @sql = 'select @totalRecord = count(1) from ' + @TableName + ' where ' + @sqlWhere
    
        EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数        
        
        --计算总页数
        select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)
    
        if (@sqlWhere='' or @sqlWhere=NULL)
            set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName
        else
            set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere
            
        
        --处理页数超出范围情况
        if @PageIndex<=0 
            Set @pageIndex = 1
        
        if @pageIndex>@TotalPage
            Set @pageIndex = @TotalPage
    
         --处理开始点和结束点
        Declare @StartRecord int
        Declare @EndRecord int
        
        set @StartRecord = (@pageIndex-1)*@PageSize + 1
        set @EndRecord = @StartRecord + @pageSize - 1
    
        --继续合成sql语句
        set @Sql = @Sql + ') as ' + @TableName + ' where rowId between ' + Convert(varchar(50),@StartRecord) +'  and ' +  Convert(varchar(50),@EndRecord)
        
        Exec(@Sql)
        ---------------------------------------------------
        If @@Error <> 0
          Begin
            RollBack Tran
            Return -1
          End
         Else
          Begin
            Commit Tran
            Return @totalRecord ---返回记录总数
          End    
    end

    调用

    up_Page_2005 'Student','*','S#','',5,2,0

    结果

    http://blog.sina.com.cn/s/blog_5e7917a50100bzq6.html

    SET QUOTED_IDENTIFIER ON
    GO
    是什么意思?
    语法
    SET QUOTED_IDENTIFIER { ON | OFF }
    注释
    当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔。当 SET QUOTED_IDENTIFIER 为 OFF 时,标识符不可加引号,且必须遵守所有 Transact-SQL 标识符规则。有关更多信息,请参见使用标识符。文字可以由单引号或双引号分隔。
    当 SET QUOTED_IDENTIFIER 为 ON 时,由双引号分隔的所有字符串都被解释为对象标识符。因此,加引号的标识符不必遵守 Transact-SQL 标识符规则。它们可以是保留关键字,并且可以包含 Transact-SQL 标识符中通常不允许的字符。不能使用双引号分隔文字字符串表达式,而必须用单引号括住文字字符串。如果单引号 (') 是文字字符串的一部分,则可以由两个单引号 ('') 表示。当对数据库中的对象名使用保留关键字时,SET QUOTED_IDENTIFIER 必须为 ON。
    当 SET QUOTED_IDENTIFIER 为 OFF(默认值)时,表达式中的文字字符串可以由单引号或双引号分隔。如果文字字符串由双引号分隔,则可以在字符串中包含嵌入式单引号,如省略号。
    当在计算列或索引视图上创建或操作索引时,SET QUOTED_IDENTIFIER 必须为 ON。如果 SET QUOTED_IDENTIFIER 为 OFF,则计算列或索引视图上带索引的表上的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。有关计算列上的索引视图和索引所必需的 SET 选项设置的更多信息,请参见 SET 中的"使用 SET 语句时的注意事项"。

    SET ANSI_NULLS ON是什么意思?
    SQL-92 标准要求在对空值进行等于 (=) 或不等于 (<>) 比较时取值为 FALSE。当 SET ANSI_NULLS 为 ON 时,即使 column_name 中包含空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。即使 column_name 中包含非空值,使用 WHERE column_name <> NULL 的 SELECT 语句仍会返回零行。
    当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵从 SQL-92 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中包含空值的行。使用 WHERE column_name <> NULL 的 SELECT 语句返回列中包含非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有不为 XYZ_value 也不为 NULL 的行。

  • 相关阅读:
    2020多校补题集
    2020牛客多校第10场C Decrement on the Tree树上路径删除
    主席树模板(查询区间第K大的元素)
    第一次小赛
    计算几何小知识整理
    咸鱼暂时退圈
    mysql 格式化时间
    mysql 中国省份城市数据库表
    CF786B Legacy (线段树优化建图模板)
    树上两点期望距离
  • 原文地址:https://www.cnblogs.com/cpcpc/p/2813088.html
Copyright © 2011-2022 走看看