---------- -- 超级通用型分页存储过程 -- 可对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 |