知识大全 分页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相关参考
SQLServer千万数量级分页存储过程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 随着信息
oracle存储过程分页代码是怎么实现的我们来看下实验小编为您整理的方法吧! /*******存储过程分页代码**********/ 包头 createorreplacepackagepck
createorreplacepackagemypack as typecursortestCursorisrefcursor; endmypack; tableName表名pageSiz
“俄罗斯存储过程”的改良版 CREATEprocedurepagination(@pagesizeint页面大小如每页存储条记录@pageindexint当前页码)assetnocountonb
高效SQL分页存储过程(2) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Book类负责查询数
CREATEPROCmyx_prPageRecordset @queryStrnvarchar() @keyFieldnvarc
SQL大数据量分页存储过程效率测试 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! /*存储过程分
ASP.NET利用存储过程实现分页 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 首先说下思路写
ASP.NET存储过程自定义分页详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n
前台设计复制代码代码如下:<%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="pagingaspxcs"Inherits="五二一练习