`

高效分页sql存储过程

 
阅读更多
我这里有一个存储过程,很长很长啊。
--别看他很长,但是效率很高。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分页 sqlserver中存储过程分页

    通过上述分析可以看出,这个存储过程通过动态生成 SQL 语句的方式实现了较为灵活且高效的分页查询。这种实现方式不仅适用于 SQL Server,也可以为其他关系型数据库设计分页查询提供一定的参考价值。对于实际项目开发...

    SQL高效存储过程分页

    当我们谈论“SQL高效存储过程分页”时,我们主要关注如何利用存储过程来实现数据库查询的分页效果,这在大数据量的场景下尤为重要,因为直接查询所有数据可能会导致性能下降,甚至阻塞数据库服务。 分页是Web应用...

    C# sql分页存储过程例子

    本示例将详细阐述如何在C#应用程序中利用SQL Server的存储过程实现分页功能。 首先,我们要了解什么是分页。分页是一种在用户界面上显示大量数据时,将数据分成多个小块(页)的方法,每次只加载一部分数据,而不是...

    Oracle通用数据库存储过程代码--高效分页存储过程

    ### Oracle通用数据库存储过程代码——高效分页存储过程解析 #### 标题解析 标题“Oracle通用数据库存储过程代码——高效分页存储过程”表明这是一个适用于Oracle数据库的存储过程,主要用于实现高效的分页查询功能...

    sql分页存储过程(无论那个表,表中有多少字段都可以用这一个存储过程)

    标签“sql分页 sql存储过程 sql分页存储过程”简明扼要地概括了本存储过程的核心功能:SQL分页查询,且是通过存储过程的形式实现。 ### 存储过程详细代码分析 首先,检查当前数据库是否存在名为`GetRecords`的存储...

    高效分页存储过程过程

    ### 高效分页存储过程实现详解 #### 标题:高效分页存储过程过程 #### 描述: 本文档详细介绍了如何使用一个自定义的存储过程`search_sp`来实现数据库中的分页查询功能。该存储过程允许用户指定表名、需要返回的...

    SqlServer 分页存储过程以及代码调用

    总结,SQL Server的分页存储过程可以帮助我们高效地处理分页查询。正确地设计和调用这些存储过程,可以提升应用的性能并提供更好的用户体验。在实际开发中,根据项目的具体需求,可以对存储过程进行适当的修改和扩展...

    经典的分页、排序SQL 通用存储过程.rar

    综上所述,"经典的分页、排序SQL 通用存储过程"旨在解决数据库查询中的性能挑战,通过创建存储过程实现灵活、高效的分页和排序。这样的存储过程不仅可以应用于MySQL,其他支持存储过程的数据库系统,如SQL Server、...

    SqlServer高效万能分页存储过程

    使用系统游标分页,数据越大越能显示高效

    高效分页存储过程

    ### 高效分页存储过程解析与应用 在数据库操作中,分页是常见的需求之一,尤其是在处理大量数据时,合理的分页策略不仅能提升用户体验,还能显著提高系统的响应速度和性能。本文将深入分析一个高效的分页存储过程,...

    sql高效分页存储过程

    sql高效分页存储过程,本人已使用多个项目无发现问题的,推荐大家使用。

    最简单的SQL Server数据库存储过程分页

    本文介绍一种简单且高效的SQL Server存储过程实现分页的方法,这种方法仅需提供SQL语句、每页的记录数以及当前页数即可快速完成分页操作。 #### SQL Server存储过程分页原理 在SQL Server中,通过存储过程实现分页...

    sqlserver+group by分组查询分页存储过程

    根据给定的SQL Server存储过程代码片段,我们可以深入解析与SQL Server中的`GROUP BY`分组查询、存储过程以及分页技术相关的知识点。 ### SQL Server中的`GROUP BY`分组查询 `GROUP BY`子句在SQL查询语言中用于将...

    一个收藏了N年的分页SQL存储过程

    本资源“一个收藏了N年的分页SQL存储过程”提供了一种在SQL Server 2000环境下进行高效分页的方法,其描述表明这种方法具有很好的实用性和兼容性。 首先,我们要理解什么是存储过程。存储过程是预编译的SQL语句集合...

    C# SQL2005 分页排序存储过程

    总之,C#结合SQL Server 2005的分页排序存储过程是高效处理大量数据的关键。通过创建存储过程并用C#调用,可以在后端数据库层面进行计算,减轻前端负担,提升系统性能。同时,通过动态调整排序和分页参数,可以满足...

    sqlserver 分页存储过程

    SQL Server 分页存储过程是一种在数据库中实现高效数据分页查询的方法。在大型数据集的展示中,分页是必不可少的,因为它允许用户逐步浏览数据,而不是一次性加载所有记录,从而提高用户体验并减少服务器负载。以下...

    速度最快sql分页存储过程

    通过以上分析可以看出,这个所谓的“速度最快”SQL分页存储过程通过一系列精心设计的逻辑处理和技巧应用,在一定程度上实现了高效的分页查询功能。但在实际应用中还需考虑更多因素,如安全性、兼容性和性能等方面的...

Global site tag (gtag.js) - Google Analytics