捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号-1 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
盒子资源分类
全部展开 - 全部合拢
超级通用型分页存储过程
关键字:SQL 分页 存储过程
来 自:原创
平 台:Win2k/XP/NT,Win2003 下载所需:0 火柴
深浅度:中级 完成时间:2012/1/16
发布者:dcopyboy 发布时间:2012/2/25
编辑器:DELPHI7 语  种:简体中文
分 类:数据库 下载浏览:280/6981
加入到我的收藏
下载错误报错
登陆以后才能下载
 用户名:
 密 码:
自动登陆(30天有效)
图片如果打不开,说明流量不够了,请稍候下载……
----------
-- 超级通用型分页存储过程
--          可对Select 语句进行分页,可带 order 、group 等子句
--          KeyField (关键词) 可以为空,也可以由多个,用,间隔
--          使用Keyfield 可以进行缓冲更新模式
--          Dcopyboy 义乌科创计算机有限公司 软件部
--          2012-01-08
----------
CREATE proc GetData
@SQLSTR varchar(8000),
@KeyField varchar(500),
@PageNo int,
@PageSize int
as
begin
 DECLARE @pos int,@SQLSTR1 varchar(8000),@SQLSTR2 varchar(50)
 set @SQLSTR = Rtrim(Ltrim(@SQLSTR))
 if lower(SUBSTRING (@SQLSTR, 1, 6)) = 'select' 
 begin
 set @SQLSTR =Rtrim(Ltrim(SUBSTRING(@SQLSTR, 7, 8000)))
 if SUBSTRING(@SQLSTR, 1, 8) = 'distinct' begin
  set @SQLSTR =Rtrim(Ltrim(SUBSTRING(@SQLSTR, 9, 8000)))
  if SUBSTRING(@SQLSTR, 1, 4) <> 'top ' 
  begin
  set @SQLSTR = 'select distinct top 10000000 ' + @SQLSTR
  end
  else begin
   set @SQLSTR = 'select distinct ' + @SQLSTR
  end
 end
 else begin  
  if SUBSTRING(@SQLSTR, 1, 4) <> 'top ' 
   begin
   set @SQLSTR = 'select top 10000000 ' + @SQLSTR
   end
   else begin
   set @SQLSTR = 'select ' + @SQLSTR
   end
  end
if @keyField<>'' 
begin 
DECLARE @KeyField1 varchar(500),@field varchar(50),@Cxtj varchar(2000),@Fields varchar(1000)
set @KeyField1=rtrim(ltrim(@KeyField)) 
set @Cxtj=''
set @Fields=''
 set @pos=CHARINDEX (',',@KeyField1)
 while @pos>0 begin
 set @field=left(@KeyField1,@pos-1)
 set @KeyField1=rtrim(ltrim(right(@KeyField1,len(@KeyField1)-@pos)))
 set @pos=CHARINDEX ('.',@field)
 if @pos>0 begin
   set @Cxtj=@Cxtj+'#temp1.'+right(@field,len(@field)-@pos)+'='+@field+' and '
   set @Fields=@Fields+right(@field,len(@field)-@pos)+','
 end
 else begin
   set @Cxtj=@Cxtj+'#temp1.'+@field+'='+@field+' and '
   set @Fields=@Fields+@field+','
 end
  set @pos=CHARINDEX (',',@KeyField1)
 end
if @KeyField1<>''
begin
 set @pos=CHARINDEX ('.',@KeyField1)
 if @pos>0 begin
   set @Cxtj=@Cxtj+'#temp1.'+right(@KeyField1,len(@KeyField1)-@pos)+'='+@KeyField1+' and '
   set @Fields=@Fields+right(@KeyField1,len(@KeyField1)-@pos)+','
 end
 else begin
   set @Cxtj=@Cxtj+'#temp1.'+@KeyField1+'='+@KeyField1+' and '
   set @Fields=@Fields+@KeyField1+','
  end
end

if Right( @Cxtj,4)='and ' 
set @Cxtj=left(@Cxtj,len(@Cxtj)-4)
 set @pos=CHARINDEX ('where',LOWER(@SQLSTR))
 If @pos>0 begin
   set @pos=@pos+4
   set @SQLSTR1=left(@SQLSTR,@pos)+' EXISTS (select * from #temp1 where rowNumber between @t+1 and @t+@PageSize and '+@Cxtj+') and '+right(@SQLSTR,len
(@SQLSTR)-@pos)
   set @SQLSTR2= ' SELECT '+@Fields
 end
 else RAISERROR ('带关键字段的分页查询必须带where子句!', 16, 1)
end
else begin
 set @SQLSTR1=' select * from #temp1 where rowNumber between @t+1 and @t+@PageSize order by rowNumber '
 set @SQLSTR2=' SELECT T1.*,'
end
set @SQLSTR= 'declare @PageSize int,@pageno int '+
 ' declare @RecordCount int,@t int '+
 ' Set @PageSize='+convert(varchar(10),@PageSize)+
 ' set @pageno='+convert(varchar(10),@pageno)+ 
 @SQLSTR2+'IDENTITY(INT,1,1) AS rowNumber INTO #temp1 FROM ('+@SQLSTR+') AS T1 left JOIN (select 1 as a) AS T2 ON 1=2'+
 ' select @RecordCount= @@rowcount '+
 ' if @pageno<1 select @pageno=1 ' +
 ' select @T=(@PageNo-1)*@PageSize ' +
 ' if @T>=@RecordCount set @T=@T-@RecordCount '+@SQLSTR1+
 ' drop table #temp1 '+
 ' select @RecordCount as 记录数 '
 exec(@SQLSTR) 
end
else RAISERROR ('只适合Select带头的语句', 16, 1)
end
GO

  下次将发表可以使用Parameters 的参数 超级通用型分页DELPHI 函数(过程),欢迎大家多提意见。


  义乌科创计算机有限公司软件部
   Dcopyboy
   Email:dcopyboy@tom.com
   QQ:445235526
Google
 
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们
龙脉加密锁 15元起 Grid++Report 报表 申请支付@网
 相关文章
没有相关文章
相关评论
共有评论3条
我要发表评论 查看全部评论
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号-1 更新RSS列表