zoukankan      html  css  js  c++  java
  • CYQ.Data 数据框架 数据库分页方式及存储过程[SQL2000/SQL2005/Oracle]

    CYQ.Data 分页是内部集成的功能,针对不同的数据库,使用不同的分页形式。

    1:Access   :集成:使用3次Top分页

    2:MySql    :集成,使用Limit N分页

    3:Sqlite    :集成,使用Limit N分页

    4:Sql2000:外置存储过程,使用临时表方式分页

    5:Sql2005:外置存储过程,使用ROW_NUMBER方式分页

    6:Oracle   :外置存储过程,使用RowNum 方式分页

    下面是三种不同存储过程代码:

     1:CYQ.Data 数据框架在 SQL2000 的 分页存储过程 的代码:

     

    create  procedure SelectBase
               @PageIndex         int,
               @PageSize      int,
               @TableName    nvarchar(4000),
               @Where     nvarchar(2000)=''
               as
               Declare @rowcount    int
               Declare @intStart    int
               Declare @intEnd         int
               declare @Column1 varchar(32) --第一列名称
               Declare @Sql nvarchar(2000), @WhereR nvarchar(1000), @OrderBy nvarchar(1000)
               set @rowcount=0
               set nocount on
               if @Where<>''
               begin
               set @Where=' and '+@Where
               end
               if CHARINDEX('order by', @Where)>0
               begin
               set @WhereR=substring(@Where, 1, CHARINDEX('order by',@Where)-1) --取得条件
               set @OrderBy=substring(@Where, CHARINDEX('order by',@Where), Len(@Where)) --取得排序方式(order by 字段 方式)
               end
               else
               begin
               set @WhereR=@Where
               set @OrderBy=' order by id asc'
               end
               set @Sql='SELECT @rowcount=count(*) from '+cast(@TableName as varchar(4000))+' where 1=1 '+@WhereR

               exec sp_executeSql @Sql,N'@rowcount int output',@rowcount output
               if @PageIndex=0 and @PageSize=0 --不进行分页,查询所有数据列表
               begin
               set @Sql='SELECT * from '+cast(@TableName as varchar(4000))+' where 1=1 '+@Where
               end
               else --进行分页查询数据列表
               begin
               set @intStart=(@PageIndex-1)*@PageSize+1;
               set @intEnd=@intStart+@PageSize-1
               set @Column1=col_name(object_id(@tableName),1) --设置第一列名称
               if @Column1 is null begin set @Column1='ID' end --设置默认为ID列
               set @Sql='Create table #tem(tempID int identity(1,1) not null,Row int) ' 
               set @Sql=@Sql+'insert #tem(Row) select '+@Column1+' from '+@TableName+' where 1=1 '+@Where 
               set @Sql=@Sql+' select * from '+@TableName+' left join #tem  on '+@Column1+'=#tem.Row
               set @Sql=@Sql+' where  #tem.tempID between '+cast(@intStart as varchar)+' and '+cast(@intEnd as varchar)
               end
               exec sp_executeSql @Sql
               return @rowcount
               set nocount off 
    GO

     

    Tip:

    最近有使用 SQL2000 的网友在分页上出了点问题,经过重重排查,竟然是由于分页里的注释代码引起的。

    所以,使用此分页存储过程的网友注意一下,如果有问题,请把注释删除。

     

    2:CYQ.Data 数据框架在 SQL2005 的 分页存储过程 的代码:

    Create procedure [SelectBase]
    @PageIndex         int,
    @PageSize      int,
    @TableName    nvarchar(4000),
    @Where     nvarchar(max)=''
    as
    Declare @rowcount    int
    Declare @intStart    int
    Declare @intEnd         int
    Declare @SQl nvarchar(max), @WhereR nvarchar(max), @OrderBy nvarchar(max)
    set @rowcount=0
    set nocount on
    if @Where<>''
    begin
    set @Where=' and
    '+@Where
    end
    if CHARINDEX('order by', @Where)>0
    begin
    set @WhereR=substring(@Where, 1, CHARINDEX('order by',@Where)-1) --取得条件
    set @OrderBy=substring(@Where, CHARINDEX('order by',@Where), Len(@Where)) --取得排序方式(order by 字段 方式)
    end
    else
    begin
    set @WhereR=@Where
    set @OrderBy=' order by id asc'
    end
    set @SQl='SELECT @rowcount=count(*) from '+cast(@TableName as varchar(4000))+' where 1=1
    '+@WhereR
    exec sp_executeSql @SQl,N'@rowcount int output',@rowcount output
    if @PageIndex=0 and @PageSize=0 --不进行分页,查询所有数据列表
    begin
    set @SQl='SELECT * from '+cast(@TableName as varchar(4000))+' where 1=1
    '+@Where
    end
    else --进行分页查询数据列表
    begin
    set @intStart=(@PageIndex-1)*@PageSize+1;
    set @intEnd=@intStart+@PageSize-1
    set @SQl='select * from(select *,ROW_NUMBER() OVER('+cast(@OrderBy as nvarchar(400))+') as row from '
    set @SQl=@SQL+@TableName+' where 1=1
    '+@WhereR+') as a where row between '+cast(@intStart as varchar)+' and '+cast(@intEnd as varchar)
    end
    exec sp_executeSql @SQl
    return @rowcount
    set nocount off

    3:Oracle 的分页存储过程代码

    这里就不贴了,见帖子:折腾Oracle问题小菜记[分页存储过程/查询所有表、视图、存储过程/查询表、视图、存储过程字段结构与参数](三)

     

  • 相关阅读:
    Excel长数字防止转换为科学计数法
    SVN迁移部署
    且行且珍惜
    功能的权衡——推荐功能做不做?
    渗透小白如何学编程
    Metasploit log命令技巧
    Metasploit 使用msfconsole帮助功能技巧
    Metasploit resource命令技巧
    Metasploit makerc命令技巧
    Metasploit irb命令使用技巧
  • 原文地址:https://www.cnblogs.com/cyq1162/p/2050283.html
Copyright © 2011-2022 走看看