我这里有一个存储过程,很长很长啊。
--别看他很长,但是效率很高。5000万条数据亲测。
--不知道你用什么变成语言。这里就不不写调用方法了。
CREATE proc newgetpage
(--默认分页主键为id
@tblName nvarchar(128), --表名称列表
@PageSize int=10, --页尺寸
@PageIndex int=1, --当前页
@fields nvarchar(4000)='*', --查询字段列表
@fldname nvarchar(50), --主键字段名
@fldorder bit=1, --主键排序方式,0asc,非零desc
@FirstfldName nvarchar(50)='', --主排序字段名,非主键,有重复值
@FirstfldOrder bit=1, --主字段排序方式
@SecondfldName nvarchar(50)='', --副排序字段名,非主键,有重复值
@SecondfldOrder bit=1, --副字段排序方式
@strWhere nvarchar(1000)='', --查询条件
@Iscount bit=0 --返回记录总数,非0则返回
)
as
declare @strsql nvarchar(4000) --主语句
declare @strtmp nvarchar(500) --临时变量
declare @strorder nvarchar(500) --总排序方式
declare @stropporder nvarchar(500) --总排序的反方式
declare @strorderfldlist nvarchar(500) --所有要排序的字段序列
declare @selectfld nvarchar(500) --选择主键page
declare @selectfirst nvarchar(500) --选择主排序page
declare @selectsecond nvarchar(500) --选择副排序page
/**/
declare @strwheretmp nvarchar(500) --临时where变量
if @strwhere!=''
set @strwheretmp=' where '
else
set @strwheretmp=''
/**/
set @strsql=''
set @strtmp=''
set @strorder=''
set @stropporder=''
set @strorderfldlist=''
set @selectfld=''
set @selectfirst=''
set @selectsecond=''
if @pagesize<1
set @pagesize=10
if @pageindex<1
set @pageindex=1
if @fields=''
set @fields='*'
if @FirstfldName=''
set @FirstfldName=''
if @SecondfldName=''
set @SecondfldName=''
--------------------------------bengin
----------总排序方式
if @fldorder!=0
begin
-----正排序
set @strorder=@fldname + ' desc '
if @secondfldname!=''
if @secondfldorder!=0
set @strorder=@secondfldname + ' desc,'+@strorder
else
set @strorder=@secondfldname + ' asc,'+@strorder
if @firstfldname!=''
if @firstfldorder!=0
set @strorder=@firstfldname + ' desc,'+@strorder
else
set @strorder=@firstfldname + ' asc,'+@strorder
-----反排序
set @stropporder=@fldname + ' asc '
if @secondfldname!=''
if @secondfldorder!=0
set @stropporder=@secondfldname + ' asc,'+@stropporder
else
set @stropporder=@secondfldname + ' desc,'+@stropporder
if @firstfldname!=''
if @firstfldorder!=0
set @stropporder=@firstfldname + ' asc,'+@stropporder
else
set @stropporder=@firstfldname + ' desc,'+@stropporder
end
else
begin
-----正排序
set @strorder=@fldname + ' asc '
if @secondfldname!=''
if @secondfldorder!=0
set @strorder=@secondfldname + ' desc,'+@strorder
else
set @strorder=@secondfldname + ' asc,'+@strorder
if @firstfldname!=''
if @firstfldorder!=0
set @strorder=@firstfldname + ' desc,'+@strorder
else
set @strorder=@firstfldname + ' asc,'+@strorder
-----反排序
set @stropporder=@fldname + ' desc '
if @secondfldname!=''
if @secondfldorder!=0
set @stropporder=@secondfldname + ' desc,'+@stropporder
else
set @stropporder=@secondfldname + ' asc,'+@stropporder
if @firstfldname!=''
if @firstfldorder!=0
set @stropporder=@firstfldname + ' desc,'+@stropporder
else
set @stropporder=@firstfldname + ' asc,'+@stropporder
end
set @stropporder=' order by '+@stropporder
set @strorder=' order by '+@strorder +' '
---------总排序方式end
---------总排序字段序列
set @strorderfldlist='id'
if @firstfldname!=''
begin
set @strorderfldlist=@firstfldname+','+@strorderfldlist
if @secondfldname!=''
set @strorderfldlist=@secondfldname+','+@strorderfldlist
end
---------总排序字段序列end
if @Firstfldname!=''
-------若主排序字段不空,则按主排序字段排序,
begin
if @fldorder!=0
set @strTmp = '<=(select top 1'
else
set @strTmp = '>=(select top 1'
set @selectfld=@fldname + replace(@strtmp,'=','')+'('+@fldname+')from(select top ' + str((@PageIndex-1)*@PageSize)
+ ' '+@strorderfldlist +' from '+@tblname+' '+@strwheretmp+@strwhere +@strorder
+')as tbltmp '+ @stropporder +')'
if @firstfldname!=''
set @selectfirst=' and '+@firstfldname + @strtmp+'('+@firstfldname+')from(select top ' + str((@PageIndex-1)*@PageSize)
+ ' '+@strorderfldlist +' from '+@tblname+' '+@strwheretmp+@strwhere +@strorder
+')as tbltmp '+ @stropporder +')'
if @secondfldname!=''
set @selectsecond=' and '+@secondfldname + @strtmp+'('+@secondfldname+')from(select top ' + str((@PageIndex-1)*@PageSize)
+ ' '+@strorderfldlist +' from '+@tblname+' '+@strwheretmp+@strwhere +@strorder
+')as tbltmp '+ @stropporder +')'
------------多字段排序代码
set @strSQL = 'select top ' + str(@PageSize) + ' '+@fields+' from '
+ @tblName + ' where ' + @selectfld + @selectfirst+ @selectsecond+ @strOrder
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + ' '+@fields+' from '
+ @tblName + ' where ' + @selectfld + @selectfirst+ @selectsecond+' and ' + @strWhere + ' ' + @strOrder
------------多字段排序代码end
end
-------若主排序字段不空,则按主排序字段排序,end
else
-------若主排序字段为空,则按主键排序,
begin
if charindex('.',@fldname)>0
set @selectfld=substring(@fldname,charindex('.',@fldname)+1,len(@fldname))
else
set @selectfld=@fldname
if @fldorder!=0
begin
set @strTmp = '<(select top 1'
set @strOrder = ' order by ' + @fldName +' desc'
set @stropporder=' order by '+@selectfld +' asc'
end
else
begin
set @strTmp = '>(select top 1'
set @strOrder = ' order by ' + @fldName +' asc'
set @stropporder=' order by '+@selectfld +' desc '
end
set @strSQL = 'select top ' + str(@PageSize) + ' '+@fields+' from '
+ @tblName + ' where ' + @fldName + '' + @strTmp + '('
+ @selectfld + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '
+ @fldName + ' from ' + @tblName + '' + @strOrder + ') as tblTmp '+@stropporder +')'
+ @strOrder
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + ' '+@fields+' from '
+ @tblName + ' where ' + @fldName + '' + @strTmp + '('
+ @selectfld + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '
+ @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp '+@stropporder +') and ' + @strWhere + ' ' + @strOrder
end
-------若主排序字段为空,则按主键排序,end
if @PageIndex = 1
begin
set @strTmp = ''
if @strWhere != ''
set @strTmp = ' where ' + @strWhere
set @strSQL = 'select top ' + str(@PageSize) + ' '+@fields+' from '
+ @tblName + '' + @strTmp + ' ' + @strOrder
end
if @IsCount != 0
begin
set @strSQL = 'select count(*) as Total from ' + @tblName + ''
if @strWhere!=''
set @strSQL='select count(*) as Total from '+@tblName +' where ' +@strWhere
end
--print @strsql
exec (@strSQL)
GO
分享到:
相关推荐
sql 高效分页存储过程 sql 高效分页存储过程 sql 高效分页存储过程 sql 高效分页存储过程 sql 高效分页存储过程
SQL2000及SQL2005的高效分页存储过程
使用系统游标分页,数据越大越能显示高效
sql高效分页存储过程,本人已使用多个项目无发现问题的,推荐大家使用。
Asp.net 高效的分页存储过程,已通过测试.
SQL Server 2000下的通用分页存储过程.sql
即使在一个函数内多次出现,每个未声明的标识符在其即使在一个函数内多次出现,每个未声明的标识符在其即使在一个函数内多次出现,每个未声明的标识符在其
高效的分页存储过程! MSSQL写法,分页存储过程
Server2005/2008专用高效分页存储过程(支持多字段排序).
几乎每一个WEB应用都会用到分页,因此,将其做得通用高效就变得非常重要了,根据自己的想法用存储过程做了一个分页的存储过程,与大家分享,希望能够通过讨论得到更好的解决方案。 --之所以用存储过程,是因为以后...
高效分页存储过程。适合数据量大的分页。 速度快。
高效的存储过程分页,实例操作,有前台和后台代码,执行效率高.
Server2005/2008专用高效分页存储过程(支持多字段排序,支持Group By分组).
适用于单一主键或存在唯一值列的表或视图,高效通用分页存储过程(双向检索)
asp.net中GridView高效分页示例,非使用存储过程,简单易用,效率高。
自己写的,不怎么好。 呵呵,贴出来大家参考参考!
一个通用的非常简单实用的分页存储过程,可以减轻数据库查询的压力,程序员快速开发出现高效的查询代码
本人自己开发的一个ASP类+SQL存储过程的分页代码,适合SQL数据库使用,对具有大量数据的分页显示特别试用。利用ASP类调用SQL的存储过程。 文件里是一个例子,下载后附加数据库既可直接运行。
由铁拳大虾编写的分页存储过程(SQLServer)
几乎每一个WEB应用都会用到分页,因此,将其做得通用高效就变得非常重要了,根据自己的想法用存储过程做了一个分页的存储过程,与大家分享,希望能够通过讨论得到更好的解决方案。 之所以用存储过程,是因为以后需要...