知识大全 分页SQLServer存储过程

Posted

篇首语:八成熟,十成收;十成熟,二成丢。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 分页SQLServer存储过程相关的知识,希望对你有一定的参考价值。

分页SQLServer存储过程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

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

  显示指定表 视图 查询结果的第X页

  对于表中主键或标识列的情况 直接从原表取数查询 其它情况使用临时表的方法

  如果视图或查询结果中有主键 不推荐此方法*/

  /* 调用示例

  exec p_show 地区资料

  exec p_show 地区资料 地区编号 地区名称 助记码 地区编号

   */

  /*

  因为要顾及通用性 所以对带排序的查询语句有一定要求 如果先排序 再出结果 就是:

  exec p_show select top percent * from 地区资料 order by 地区名称 地区编号 地区名称 助记码 地区名称

   查询语句加上:top percent //top时

  */

  if exists (select * from dbo sysobjects where id = object_id(N [dbo] [p_show] ) and OBJECTPROPERTY(id N IsProcedure ) = )

  drop procedure [dbo] [p_show]

  GO

  CREATE Proc p_show

  @QueryStr nvarchar( ) 表名 视图名 查询语句

  @PageSize int= 每页的大小(行数)

  @PageCurrent int= 要显示的页

  @FdShow nvarchar ( )= 要显示的字段列表 如果查询结果有标识字段 需要指定此值 且不包含标识字段

  @FdOrder nvarchar ( )= 排序字段列表

  as

  declare @FdName nvarchar( ) 表中的主键或表 临时表中的标识列名

   @Id varchar( ) @Id varchar( ) 开始和结束的记录号

   @Obj_ID int 对象ID

   表中有复合主键的处理

  declare @strfd nvarchar( ) 复合主键列表

   @strjoin nvarchar( ) 连接字段

   @strwhere nvarchar( ) 查询条件

  select @Obj_ID=object_id(@QueryStr)

   @FdShow=case isnull(@FdShow ) when then * else

  [url=mailto: +@FdShow] +@FdShow[/url]

  end

   @FdOrder=case isnull(@FdOrder ) when then else order by

  [url=mailto: +@FdOrder] +@FdOrder[/url]

  end

   @QueryStr=case when @Obj_ID is not null then

  [url=mailto: +@QueryStr] +@QueryStr[/url]

  else (

  [url=mailto: +@QueryStr+ ] +@QueryStr+ [/url]

  ) a end

   如果显示第一页 可以直接用top来完成

  if @PageCurrent=

  begin

  select @Id =cast(@PageSize as varchar( ))

  exec( select top

  [url=mailto: +@Id +@FdShow+ ] +@Id +@FdShow+ [/url]

  from

  [url=mailto: +@QueryStr+@FdOrder] +@QueryStr+@FdOrder[/url]

  )

  return

  end

   如果是表 则检查表中是否有标识更或主键

  if @Obj_ID is not null and objectproperty(@Obj_ID IsTable )=

  begin

  select @Id =cast(@PageSize as varchar( ))

   @Id =cast((@PageCurrent )*@PageSize as varchar( ))

  select @FdName=name from syscolumns where

  [url=mailto:id=@Obj_ID]id=@Obj_ID[/url]

  and status= x

  if @@rowcount= 如果表中无标识列 则检查表中是否有主键

  begin

  if not exists(select from sysobjects where

  [url=mailto:parent_obj=@Obj_ID]parent_obj=@Obj_ID[/url]

  and xtype= PK )

  goto lbusetemp 如果表中无主键 则用临时表处理

  select @FdName=name from syscolumns where

  [url=mailto:id=@Obj_ID]id=@Obj_ID[/url]

  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

  [url=mailto:parent_obj=@Obj_ID]parent_obj=@Obj_ID[/url]

  )))

  if @@rowcount> 检查表中的主键是否为复合主键

  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

  [url=mailto:id=@Obj_ID]id=@Obj_ID[/url]

  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

  [url=mailto:parent_obj=@Obj_ID]parent_obj=@Obj_ID[/url]

  )))

  select @strfd=substring(@strfd )

   @strjoin=substring(@strjoin )

   @strwhere=substring(@strwhere )

  goto lbusepk

  end

  end

  end

  else

  goto lbusetemp

  /* 使用标识列或主键为单一字段的处理方法 */

  lbuseidentity:

  exec( select top

  [url=mailto: +@Id +@FdShow+ ] +@Id +@FdShow+ [/url]

  from

  [url=mailto: +@QueryStr] +@QueryStr[/url]

  + where

  [url=mailto: +@FdName+ ] +@FdName+ [/url]

  not in(select top

  [url=mailto:+@Id + ]+@Id + [/url]

  [url=mailto: +@FdName+ ] +@FdName+ [/url]

  from

  [url=mailto: +@QueryStr+@FdOrder] +@QueryStr+@FdOrder[/url]

  + ) +@FdOrder

  )

  return

  /* 表中有复合主键的处理方法 */

  lbusepk:

  exec( select

  [url=mailto: +@FdShow+ ] +@FdShow+ [/url]

  from(select top

  [url=mailto: +@Id + ] +@Id + [/url]

  a * from

  (select top percent * from

  [url=mailto: +@QueryStr+@FdOrder+ ] +@QueryStr+@FdOrder+ [/url]

  ) a

  left join (select top

  [url=mailto: +@Id + ] +@Id + [/url]

  [url=mailto: +@strfd+ ] +@strfd+ [/url]

  from

  [url=mailto: +@QueryStr+@FdOrder+ ] +@QueryStr+@FdOrder+ [/url]

  ) b on

  [url=mailto: +@strjoin+ ] +@strjoin+ [/url]

  where

  [url=mailto: +@strwhere+ ] +@strwhere+ [/url]

  ) a

  )

  return

  /* 用临时表处理的方法 */

  lbusetemp:

  select @FdName= [ID_ +cast(newid() as varchar( ))+ ]

   @Id =cast(@PageSize*(@PageCurrent ) as varchar( ))

   @Id =cast(@PageSize*@PageCurrent as varchar( ))

  exec( select

  [url=mailto: +@FdName+ =identity(int ) +@FdShow+ ] +@FdName+ =identity(int ) +@FdShow+ [/url]

  into #tb

  [url=mailto:from +@QueryStr+@FdOrder+ ]from +@QueryStr+@FdOrder+ [/url]

  select

  [url=mailto: +@FdShow+ ] +@FdShow+ [/url]

  from #tb where

  [url=mailto: +@FdName+ ] +@FdName+ [/url]

  beeen

  [url=mailto:+@Id + ]+@Id + [/url]

  and

  [url=mailto: +@Id ] +@Id [/url]

  )

cha138/Article/program/SQLServer/201311/22063

相关参考

知识大全 SQL Server 千万数量级 分页 存储过程

SQLServer千万数量级分页存储过程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  随着信息

知识大全 oracle存储过程分页代码

  oracle存储过程分页代码是怎么实现的我们来看下实验小编为您整理的方法吧!  /*******存储过程分页代码**********/  包头  createorreplacepackagepck

知识大全 oracle分页存储过程

  createorreplacepackagemypack  as  typecursortestCursorisrefcursor;  endmypack;  tableName表名pageSiz

知识大全 sql存储过程分页算法研究

  “俄罗斯存储过程”的改良版  CREATEprocedurepagination(@pagesizeint页面大小如每页存储条记录@pageindexint当前页码)assetnocountonb

知识大全 高效SQL分页存储过程(2)

高效SQL分页存储过程(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Book类负责查询数

知识大全 sql存储过程分页

  CREATEPROCmyx_prPageRecordset   @queryStrnvarchar()   @keyFieldnvarc

知识大全 SQL大数据量分页存储过程效率测试

SQL大数据量分页存储过程效率测试  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  /*存储过程分

知识大全 ASP.NET利用存储过程实现分页

ASP.NET利用存储过程实现分页  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  首先说下思路写

知识大全 ASP.NET存储过程自定义分页详解

ASP.NET存储过程自定义分页详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n

知识大全 三层+存储过程实现分页示例代码

  前台设计复制代码代码如下:<%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="pagingaspxcs"Inherits="五二一练习