我这里有一个存储过程,很长很长啊。
--别看他很长,但是效率很高。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 Server 2005及2010提供一个实用的例子。 首先,理解分页的基本概念。分页通常涉及到两个关键参数...
通过上述分析可以看出,这个存储过程通过动态生成 SQL 语句的方式实现了较为灵活且高效的分页查询。这种实现方式不仅适用于 SQL Server,也可以为其他关系型数据库设计分页查询提供一定的参考价值。对于实际项目开发...
当我们谈论“SQL高效存储过程分页”时,我们主要关注如何利用存储过程来实现数据库查询的分页效果,这在大数据量的场景下尤为重要,因为直接查询所有数据可能会导致性能下降,甚至阻塞数据库服务。 分页是Web应用...
本示例将详细阐述如何在C#应用程序中利用SQL Server的存储过程实现分页功能。 首先,我们要了解什么是分页。分页是一种在用户界面上显示大量数据时,将数据分成多个小块(页)的方法,每次只加载一部分数据,而不是...
### Oracle通用数据库存储过程代码——高效分页存储过程解析 #### 标题解析 标题“Oracle通用数据库存储过程代码——高效分页存储过程”表明这是一个适用于Oracle数据库的存储过程,主要用于实现高效的分页查询功能...
标签“sql分页 sql存储过程 sql分页存储过程”简明扼要地概括了本存储过程的核心功能:SQL分页查询,且是通过存储过程的形式实现。 ### 存储过程详细代码分析 首先,检查当前数据库是否存在名为`GetRecords`的存储...
### 高效分页存储过程实现详解 #### 标题:高效分页存储过程过程 #### 描述: 本文档详细介绍了如何使用一个自定义的存储过程`search_sp`来实现数据库中的分页查询功能。该存储过程允许用户指定表名、需要返回的...
总结,SQL Server的分页存储过程可以帮助我们高效地处理分页查询。正确地设计和调用这些存储过程,可以提升应用的性能并提供更好的用户体验。在实际开发中,根据项目的具体需求,可以对存储过程进行适当的修改和扩展...
综上所述,"经典的分页、排序SQL 通用存储过程"旨在解决数据库查询中的性能挑战,通过创建存储过程实现灵活、高效的分页和排序。这样的存储过程不仅可以应用于MySQL,其他支持存储过程的数据库系统,如SQL Server、...
使用系统游标分页,数据越大越能显示高效
### 高效分页存储过程解析与应用 在数据库操作中,分页是常见的需求之一,尤其是在处理大量数据时,合理的分页策略不仅能提升用户体验,还能显著提高系统的响应速度和性能。本文将深入分析一个高效的分页存储过程,...
sql高效分页存储过程,本人已使用多个项目无发现问题的,推荐大家使用。
本文介绍一种简单且高效的SQL Server存储过程实现分页的方法,这种方法仅需提供SQL语句、每页的记录数以及当前页数即可快速完成分页操作。 #### SQL Server存储过程分页原理 在SQL Server中,通过存储过程实现分页...
根据给定的SQL Server存储过程代码片段,我们可以深入解析与SQL Server中的`GROUP BY`分组查询、存储过程以及分页技术相关的知识点。 ### SQL Server中的`GROUP BY`分组查询 `GROUP BY`子句在SQL查询语言中用于将...
本资源“一个收藏了N年的分页SQL存储过程”提供了一种在SQL Server 2000环境下进行高效分页的方法,其描述表明这种方法具有很好的实用性和兼容性。 首先,我们要理解什么是存储过程。存储过程是预编译的SQL语句集合...
总之,C#结合SQL Server 2005的分页排序存储过程是高效处理大量数据的关键。通过创建存储过程并用C#调用,可以在后端数据库层面进行计算,减轻前端负担,提升系统性能。同时,通过动态调整排序和分页参数,可以满足...
SQL Server 分页存储过程是一种在数据库中实现高效数据分页查询的方法。在大型数据集的展示中,分页是必不可少的,因为它允许用户逐步浏览数据,而不是一次性加载所有记录,从而提高用户体验并减少服务器负载。以下...
通过以上分析可以看出,这个所谓的“速度最快”SQL分页存储过程通过一系列精心设计的逻辑处理和技巧应用,在一定程度上实现了高效的分页查询功能。但在实际应用中还需考虑更多因素,如安全性、兼容性和性能等方面的...