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

ExpandedBlockStart.gif ContractedBlock.gif /**/ /*--用存储过程实现的分页程序
InBlock.gif
InBlock.gif显示指定表、视图、查询结果的第X页
InBlock.gif对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法
InBlock.gif如果视图或查询结果中有主键,不推荐此方法
InBlock.gif
ExpandedBlockEnd.gif--邹建 2003.09(引用请保留此信息)--
*/

None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*--调用示例
InBlock.gifexec p_show '地区资料'
InBlock.gif
InBlock.gifexec p_show '地区资料',5,3,'地区编号,地区名称,助记码','地区编号'
ExpandedBlockEnd.gif--
*/

None.gif
None.gif
if   exists  ( select   *   from  dbo.sysobjects  where  id  =   object_id (N ' [dbo].[p_show] ' and   OBJECTPROPERTY (id, N ' IsProcedure ' =   1 )
None.gif
drop   procedure   [ dbo ] . [ p_show ]
None.gif
GO
None.gif
None.gif
CREATE   Proc  p_show
None.gif
@QueryStr   nvarchar ( 4000 ),  -- 表名、视图名、查询语句
None.gif
@PageSize   int = 10 -- 每页的大小(行数)
None.gif
@PageCurrent   int = 1 -- 要显示的页
None.gif
@FdShow   nvarchar  ( 4000 ) = '' -- 要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段
None.gif
@FdOrder   nvarchar  ( 1000 ) = '' -- 排序字段列表
None.gif
@Rows   int   =   null  OUTPUT  --  输出记录数, 如果@rows为null, 则输出记录数, 否则不要输出
None.gif
as
None.gif
set  nocount  on
None.gif
declare   @FdName   nvarchar ( 250 -- 表中的主键或表、临时表中的标识列名
None.gif
, @Id1   varchar ( 20 ), @Id2   varchar ( 20 -- 开始和结束的记录号
None.gif
, @Obj_ID   int   -- 对象ID
None.gif--
表中有复合主键的处理
None.gif
declare   @strfd   nvarchar ( 2000 -- 复合主键列表
None.gif
, @strjoin   nvarchar ( 4000 -- 连接字段
None.gif
, @strwhere   nvarchar ( 2000 -- 查询条件
None.gif

None.gif
None.gif
select   @Obj_ID = object_id ( @QueryStr )
None.gif,
@FdShow = case   isnull ( @FdShow , '' when   ''   then   '  * '   else   '   ' + @FdShow   end
None.gif,
@FdOrder = case   isnull ( @FdOrder , '' when   ''   then   ''   else   '  order by  ' + @FdOrder   end
None.gif,
@QueryStr = case   when   @Obj_ID   is   not   null   then   '   ' + @QueryStr   else   '  ( ' + @QueryStr + ' ) a '   end
None.gif
None.gif
-- 如果显示第一页,可以直接用top来完成
None.gif
if   @PageCurrent = 1
None.gif
begin
None.gif
select   @Id1 = cast ( @PageSize   as   varchar ( 20 ))
None.gif
exec ( ' select top  ' + @Id1 + @FdShow + '  from  ' + @QueryStr + @FdOrder )
None.gif
return
None.gif
end
None.gif
None.gif
-- 如果是表,则检查表中是否有标识更或主键
None.gif
if   @Obj_ID   is   not   null   and   objectproperty ( @Obj_ID , ' IsTable ' ) = 1
None.gif
begin
None.gif
select   @Id1 = cast ( @PageSize   as   varchar ( 20 ))
None.gif,
@Id2 = cast (( @PageCurrent - 1 ) * @PageSize   as   varchar ( 20 ))
None.gif
None.gif
select   @FdName = name  from  syscolumns  where  id = @Obj_ID   and  status = 0x80
None.gif
if   @@rowcount = 0   -- 如果表中无标识列,则检查表中是否有主键
None.gif
begin
None.gif
if   not   exists ( select   1   from  sysobjects  where  parent_obj = @Obj_ID   and  xtype = ' PK ' )
None.gif
goto  lbusetemp  -- 如果表中无主键,则用临时表处理
None.gif

None.gif
select   @FdName = name  from  syscolumns  where  id = @Obj_ID   and  colid  in (
None.gif
select  colid  from  sysindexkeys  where   @Obj_ID = id  and  indid  in (
None.gif
select  indid  from  sysindexes  where   @Obj_ID = id  and  name  in (
None.gif
select  name  from  sysobjects  where  xtype = ' PK '   and  parent_obj = @Obj_ID
None.gif)))
None.gif
if   @@rowcount > 1   -- 检查表中的主键是否为复合主键
None.gif
begin
None.gif
select   @strfd = '' , @strjoin = '' , @strwhere = ''
None.gif
select   @strfd = @strfd + ' ,[ ' + name + ' ] '
None.gif,
@strjoin = @strjoin + '  and a.[ ' + name + ' ]=b.[ ' + name + ' ] '
None.gif,
@strwhere = @strwhere + '  and b.[ ' + name + ' ] is null '
None.gif
from  syscolumns  where  id = @Obj_ID   and  colid  in (
None.gif
select  colid  from  sysindexkeys  where   @Obj_ID = id  and  indid  in (
None.gif
select  indid  from  sysindexes  where   @Obj_ID = id  and  name  in (
None.gif
select  name  from  sysobjects  where  xtype = ' PK '   and  parent_obj = @Obj_ID
None.gif)))
None.gif
select   @strfd = substring ( @strfd , 2 , 2000 )
None.gif,
@strjoin = substring ( @strjoin , 5 , 4000 )
None.gif,
@strwhere = substring ( @strwhere , 5 , 4000 )
None.gif
goto  lbusepk
None.gif
end
None.gif
end
None.gif
end
None.gif
else
None.gif
goto  lbusetemp
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*--使用标识列或主键为单一字段的处理方法--*/
None.giflbuseidentity:
None.gif
if   @Rows   is   null
None.gif
begin
None.gif
declare   @lbuseidentity   nvarchar ( 1000 )
None.gif
set   @lbuseidentity   =   ' select @rows = count(*) from  ' + @QueryStr
None.gif
exec  sp_executesql  @lbuseidentity , N ' @Rows int out ' @Rows  out
None.gif
end
None.gif
exec ( ' select top  ' + @Id1 + @FdShow + '  from  ' + @QueryStr
None.gif
+ '  where  ' + @FdName + '  not in(select top  '
None.gif
+ @Id2 + '   ' + @FdName + '  from  ' + @QueryStr + @FdOrder
None.gif
+ ' ) ' + @FdOrder
None.gif)
None.gif
return
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*--表中有复合主键的处理方法--*/
None.giflbusepk:
None.gif
if   @Rows   is   null
None.gif
begin
None.gif
declare   @lbusepk   nvarchar ( 1000 )
None.gif
set   @lbusepk   =   ' select @rows = count(*) from  ' + @QueryStr
None.gif
exec  sp_executesql  @lbusepk , N ' @Rows int out ' @Rows  out
None.gif
end
None.gif
None.gif
exec ( ' select  ' + @FdShow + '  from(select top  ' + @Id1 + '  a.* from
None.gif(select top 100 percent * from 
' + @QueryStr + @FdOrder + ' ) a
None.gifleft join (select top 
' + @Id2 + '   ' + @strfd + '
None.giffrom 
' + @QueryStr + @FdOrder + ' ) b on  ' + @strjoin + '
None.gifwhere 
' + @strwhere + ' ) a '
None.gif)
None.gif
return
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*--用临时表处理的方法--*/
None.giflbusetemp:
None.gif
select   @FdName = ' [ID_ ' + cast ( newid ()  as   varchar ( 40 )) + ' ] '
None.gif,
@Id1 = cast ( @PageSize * ( @PageCurrent - 1 as   varchar ( 20 ))
None.gif,
@Id2 = cast ( @PageSize * @PageCurrent - 1   as   varchar ( 20 ))
None.gif
None.gif
declare   @lbusetemp   nvarchar ( 4000 )
None.gif
set   @lbusetemp   =   ' select  ' + @FdName + ' =identity(int,0,1), ' + @FdShow + '
None.gifinto #tb from
' + @QueryStr + @FdOrder
None.gif
+ case   when   @Rows   is   null   then   '  set @Rows = @@rowcount  '   else   ''   end   +   '
None.gifselect 
' + @FdShow + '  from #tb where  ' + @FdName + '  between  '
None.gif
+ @Id1 + '  and  ' + @Id2
None.gif
exec  sp_executesql  @lbusetemp , N ' @Rows int out ' @Rows  out
None.gif
None.gif
GO
None.gif

转载于:https://www.cnblogs.com/yknb/archive/2006/06/23/433685.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值