C#分页存储过程

11 篇文章 0 订阅
6 篇文章 0 订阅
//第一种
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER proc [dbo].[usp_get_data_by_page]
(
    @page_size int,
    @current_page int,
    @order_by nvarchar(50)
)
as

--select top @page_size
--select * from images order by imgId

declare @sql nvarchar(4000)
set @sql = 'select top ' + cast(@page_size as nvarchar(50))+' * from images
where imgId not in (select top '+ cast(@page_size * (@current_page - 1) as nvarchar(100))+ ' imgId from images order by imgId) order by imgId desc'

--print @sql
exec(@sql)

//第二种

/*   
  函数名称: GetRecordFromPage   
  函数功能: 获取指定页的数据   
  参数说明: @tblName      包含数据的表名   
           @fldName      关键字段名   
           @PageSize     每页记录数   
           @PageIndex    要获取的页码   
           @OrderType    排序类型, 0 - 升序, 1 - 降序   
           @strWhere     查询条件 (注意: 不要加 where)   
  作  者: 铁拳   
  邮  箱: sunjianhua_kki@sina.com   
  创建时间: 2004-07-04   
  修改时间: 2004-07-04   
*/   
CREATE PROCEDURE GetRecordFromPage   
    @tblName      varchar(255),       -- 表名   
    @fldName      varchar(255),       -- 字段名   
    @PageSize     int = 10,           -- 页尺寸   
    @PageIndex    int = 1,            -- 页码   
    @OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序   
    @strWhere     varchar(2000) = ''  -- 查询条件 (注意: 不要加 where)   
AS  
 
declare @strSQL   varchar(6000)       -- 主语句   
declare @strTmp   varchar(1000)       -- 临时变量   
declare @strOrder varchar(500)        -- 排序类型   
 
if @OrderType != 0   
begin  
    set @strTmp = '<(select min'  
    set @strOrder = ' order by [' + @fldName + '] desc'  
end  
else  
begin  
    set @strTmp = '>(select max'  
    set @strOrder = ' order by [' + @fldName +'] asc'  
end  
 
set @strSQL = 'select top ' + str(@PageSize) + ' * 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) + ' * from ['  
        + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['  
        + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['  
        + @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '  
        + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder   
 
if @PageIndex = 1   
begin  
    set @strTmp = ''  
    if @strWhere != ''  
        set @strTmp = ' where (' + @strWhere + ')'  
 
    set @strSQL = 'select top ' + str(@PageSize) + ' * from ['  
        + @tblName + ']' + @strTmp + ' ' + @strOrder   
end  
 
exec (@strSQL)   
 
GO  
//第三种 sql server 2000不支持
use [L]
go

CREATE PROCEDURE [usp_get_data_by_page]
@pageindex int, ----*****页码
@PageSize int, ----*****每页显示条数
@tsql varchar(4000),----*****SQL语句
@orderby varchar(100)-----******order by
as
Declare @sql varchar(4000)
set
@sql='select * from ( SELECT ROW_NUMBER() OVER('+@orderby+') as RowsNumber, * from ('+@tsql+') as images ) images where RowsNumber between '+convert(varchar(10),((@pageindex-1) * @PageSize+1))+' and '+convert(varchar(10), @pageindex * @PageSize)
exec (@sql)
---exec [AllowPaging] 1000,10,'select * from bg_store ',' order by Nation'

//第四种
CREATE PROCEDURE WapWapIndexGetRows
(
  @PageIndex int,
  @PageSize int,
  @RecordCount int out,
  @PageCount int out,
   @type  int
)
 AS
declare @sqlstr nvarchar (1000)
 select @RecordCount = count(*) from WapIndex where Mediatype=@type
set @PageCount = ceiling(@RecordCount*1.0/@PageSize)
if(@PageIndex=0 or @PageCount<=1)
  set @sqlstr = ' select top ' + str(@PageSize) +
                        ' * from WapIndex where mediatype= '+str(@type) +' order by addtime desc '
else if(@PageIndex = @PageCount - 1)
         set @sqlstr = ' select * from (select top  ' + str(@RecordCount-@PageSize*@PageIndex)+
                             ' * from WapIndex where mediaType = '+ str(@type)+' order by id asc ) TmepTable order by addtime desc'
else
  set @sqlstr = ' select top ' + str(@PageSize) + ' * from (select top '+ str(@RecordCount-@PageSize*@PageIndex) +
  '* from WapIndex where Mediatype = '+ str(@type) +  ' order by ID asc) TempTable  order by addtime desc'
exec(@sqlstr)

GO
//第五种
use [L]
go

  CREATE PROC [usp_get_data_by_page]  
@sql         ntext,     --要执行的sql语句
@PageCurrent int=1,     --要显示的页码
@PageSize    int=10,    --每页的大小
@PageCount   int OUTPUT --总页数
AS
SET NOCOUNT ON
DECLARE @p1 int
--初始化分页游标
EXEC sp_cursoropen
    @cursor=@p1 OUTPUT,
    @stmt=@sql,
    @scrollopt=1,
    @ccopt=1,
    @rowcount=@PageCount OUTPUT

--计算总页数
IF ISNULL(@PageSize,0)<1
    SET @PageSize=10
SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
IF ISNULL(@PageCurrent,0)<1 OR ISNULL(@PageCurrent,0)>@PageCount
    SET @PageCurrent=1
ELSE
    SET @PageCurrent=(@PageCurrent-1)*@PageSize+1

--显示指定页的数据
EXEC sp_cursorfetch @p1,16,@PageCurrent,@PageSize

--关闭分页游标
EXEC sp_cursorclose @p1

//第六种

use [L]
go

/*--用存储过程实现的分页程序

 显示指定表、视图、查询结果的第X页
 对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法
 如果视图或查询结果中有主键,不推荐此方法

--邹建 2003.09(引用请保留此信息)--*/

/*--调用示例
 exec p_show '地区资料'

 exec p_show '地区资料',5,3,'地区编号,地区名称,助记码','地区编号'
--*/

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_show]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_show]
GO

CREATE Proc [usp_get_data_by_page]
@QueryStr nvarchar(4000), --表名、视图名、查询语句
@PageSize int=10,   --每页的大小(行数)
@PageCurrent int=1,   --要显示的页
@FdShow nvarchar (4000)='', --要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段
@FdOrder nvarchar (1000)='' --排序字段列表
as
declare @FdName nvarchar(250) --表中的主键或表、临时表中的标识列名
 ,@Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号
 ,@Obj_ID int    --对象ID
--表中有复合主键的处理
declare @strfd nvarchar(2000) --复合主键列表
 ,@strjoin nvarchar(4000) --连接字段
 ,@strwhere nvarchar(2000) --查询条件


select @Obj_ID=object_id(@QueryStr)
 ,@FdShow=case isnull(@FdShow,'') when '' then ' *' else ' '+@FdShow end
 ,@FdOrder=case isnull(@FdOrder,'') when '' then '' else ' order by '+@FdOrder end
 ,@QueryStr=case when @Obj_ID is not null then ' '+@QueryStr else ' ('+@QueryStr+') a' end

--如果显示第一页,可以直接用top来完成
if @PageCurrent=1
begin
 select @Id1=cast(@PageSize as varchar(20))
 exec('select top '+@Id1+@FdShow+' from '+@QueryStr+@FdOrder)
 return
end

--如果是表,则检查表中是否有标识更或主键
if @Obj_ID is not null and objectproperty(@Obj_ID,'IsTable')=1
begin
 select @Id1=cast(@PageSize as varchar(20))
  ,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20))

 select @FdName=name from syscolumns where id=@Obj_ID and status=0x80
 if @@rowcount=0   --如果表中无标识列,则检查表中是否有主键
 begin
  if not exists(select 1 from sysobjects where parent_obj=@Obj_ID and xtype='PK')
   goto lbusetemp  --如果表中无主键,则用临时表处理

  select @FdName=name from syscolumns where id=@Obj_ID and colid in(
   select colid from sysindexkeys where @Obj_ID=id and indid in(
    select indid from sysindexes where @Obj_ID=id and name in(
     select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID
   )))
  if @@rowcount>1  --检查表中的主键是否为复合主键
  begin
   select @strfd='',@strjoin='',@strwhere=''
   select @strfd=@strfd+',['+name+']'
    ,@strjoin=@strjoin+' and a.['+name+']=b.['+name+']'
    ,@strwhere=@strwhere+' and b.['+name+'] is null'
    from syscolumns where id=@Obj_ID and colid in(
    select colid from sysindexkeys where @Obj_ID=id and indid in(
     select indid from sysindexes where @Obj_ID=id and name in(
      select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID
    )))
   select @strfd=substring(@strfd,2,2000)
    ,@strjoin=substring(@strjoin,5,4000)
    ,@strwhere=substring(@strwhere,5,4000)
   goto lbusepk
  end
 end
end
else
 goto lbusetemp

/*--使用标识列或主键为单一字段的处理方法--*/
lbuseidentity:
 exec('select top '+@Id1+@FdShow+' from '+@QueryStr
  +' where '+@FdName+' not in(select top '
  +@Id2+' '+@FdName+' from '+@QueryStr+@FdOrder
  +')'+@FdOrder
  )
 return

/*--表中有复合主键的处理方法--*/
lbusepk:  
 exec('select '+@FdShow+' from(select top '+@Id1+' a.* from
  (select top 100 percent * from '+@QueryStr+@FdOrder+') a
  left join (select top '+@Id2+' '+@strfd+'
  from '+@QueryStr+@FdOrder+') b on '+@strjoin+'
  where '+@strwhere+') a'
  )
 return

/*--用临时表处理的方法--*/
lbusetemp:  
select @FdName='[ID_'+cast(newid() as varchar(40))+']'
 ,@Id1=cast(@PageSize*(@PageCurrent-1) as varchar(20))
 ,@Id2=cast(@PageSize*@PageCurrent-1 as varchar(20))

exec('select '+@FdName+'=identity(int,0,1),'+@FdShow+'
  into #tb from'+@QueryStr+@FdOrder+'
 select '+@FdShow+' from #tb where '+@FdName+' between '
 +@Id1+' and '+@Id2
 )

GO
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值