`
ydada
  • 浏览: 7974 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

分页存储过程(转)

 
阅读更多

create PROCEDURE Sp_Conn_Sort
(
@tblName   varchar(255),       -- 表名

@strGetFields varchar(1000) = '*',  -- 需要返回的列

@fldName varchar(255)='',      -- 排序的字段名

@PageSize   int = 40,          -- 页尺寸

@PageIndex  int = 1,           -- 页码

@doCount  bit = 0,   -- 返回记录总数, 非 0 值则返回

@OrderType bit = 0,  -- 设置排序类型, 非 0 值则降序
@strWhere  varchar(1500)=''  -- 查询条件 (注意: 不要加 where)
)
AS

declare @strSQL   varchar(5000)       -- 主语句

declare @strTmp   varchar(110)        -- 临时变量

declare @strOrder varchar(400)        -- 排序类型

 

if @doCount != 0

  begin

    if @strWhere !=''

    set @strSQL = 'select count(*) as Total from ' + @tblName + ' where '+@strWhere

    else

    set @strSQL = 'select count(*) as Total from ' + @tblName

end 

--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况

else

begin

 

if @OrderType != 0

begin

    set @strTmp = '<(select min'

set @strOrder = ' order by ' + @fldName +' desc'

--如果@OrderType不是0,就执行降序,这句很重要!

end

else

begin

    set @strTmp = '>(select max'

    set @strOrder = ' order by ' + @fldName +' asc'

end

 

if @PageIndex = 1

begin

    if @strWhere != ''  

    set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder

     else

     set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from '+ @tblName + ' '+ @strOrder

--如果是第一页就执行以上代码,这样会加快执行速度

end

else

begin

--以下代码赋予了@strSQL以真正执行的SQL代码

set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from '

    + @tblName + ' where ' + @fldName + '' + @strTmp + '('+ @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '+ @fldName + ' from ' + @tblName + '' + @strOrder + ') as tblTmp)'+ @strOrder

 

if @strWhere != ''

    set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from '

        + @tblName + ' where ' + @fldName + '' + @strTmp + '('

        + @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '

        + @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '

        + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

end

end  

exec (@strSQL)

-----------------

sql server 2000 单主键高效分页存储过程 (支持多字段排序)

Create PROC P_viewPage         
    
/**//*          
    nzperfect [no_mIss] 高效通用分页存储过程(双向检索) 2007.5.7  QQ:34813284          
    敬告:适用于单一主键或存在唯一值列的表或视图          
    ps:Sql语句为8000字节,调用时请注意传入参数及sql总长度不要超过指定范围          
    
*/
          
    
@TableName VARCHAR(200),     --表名          
    @FieldList VARCHAR(2000),    --显示列名,如果是全部字段则为*          
    @PrimaryKey VARCHAR(100),    --单一主键或唯一值键          
    @Where VARCHAR(2000),        --查询条件 不含'where'字符,如id>10 and len(userid)>9          
    @Order VARCHAR(1000),        --排序 不含'order by'字符,如id asc,userid desc,必须指定asc或desc          
    --注意当@SortType=3时生效,记住一定要在最后加上主键,否则会让你比较郁闷          
    @SortType INT,               --排序规则 1:正序asc 2:倒序desc 3:多列排序方法          
    @RecorderCount INT,          --记录总数 0:会返回总记录          
    @PageSize INT,               --每页输出的记录数          
    @PageIndex INT,              --当前页数          
    @TotalCount INT OUTPUT ,      --记返回总记录          
    @TotalPageCount INT OUTPUT   --返回总页数          
AS          
SET NOCOUNT ON          
    
IF ISNULL(@TotalCount,''= '' SET @TotalCount = 0          
    
SET @Order = RTRIM(LTRIM(@Order))          
    
SET @PrimaryKey = RTRIM(LTRIM(@PrimaryKey))          
    
SET @FieldList = REPLACE(RTRIM(LTRIM(@FieldList)),' ','')          
    
WHILE CHARINDEX('',@Order> 0 or CHARINDEX(' ,',@Order> 0          
        
BEGIN          
            
SET @Order = REPLACE(@Order,'',',')          
            
SET @Order = REPLACE(@Order,' ,',',')          
        
END          
    
IF ISNULL(@TableName,''= '' or ISNULL(@FieldList,''= ''          
            
or ISNULL(@PrimaryKey,''= ''          
            
or @SortType < 1 or @SortType >3          
            
or @RecorderCount  < 0 or @PageSize < 0 or @PageIndex < 0          
        
BEGIN          
            
PRINT('ERR_00')          
            
RETURN          
        
END          
    
IF @SortType = 3          
        
BEGIN          
            
IF (UPPER(RIGHT(@Order,4))!=' ASC' AND UPPER(RIGHT(@Order,5))!=' DESC')          
                
BEGIN PRINT('ERR_02'RETURN END          
        
END          
    
DECLARE @new_where1 VARCHAR(1000)          
    
DECLARE @new_where2 VARCHAR(1000)          
    
DECLARE @new_order1 VARCHAR(1000)          
    
DECLARE @new_order2 VARCHAR(1000)          
    
DECLARE @new_order3 VARCHAR(1000)          
    
DECLARE @Sql VARCHAR(8000)          
    
DECLARE @SqlCount NVARCHAR(4000)          
    
IF ISNULL(@where,''= ''          
        
BEGIN          
            
SET @new_where1 = ' '          
            
SET @new_where2 = ' Where  '          
        
END          
    
ELSE          
        
BEGIN          
            
SET @new_where1 = ' Where ' + @where          
            
SET @new_where2 = ' Where ' + @where + ' AND '          
        
END          
    
IF ISNULL(@order,''= '' or @SortType = 1  or @SortType = 2          
        
BEGIN          
            
IF @SortType = 1          
                
BEGIN          
                    
SET @new_order1 = ' orDER BY ' + @PrimaryKey + ' ASC'          
                    
SET @new_order2 = ' orDER BY ' + @PrimaryKey + ' DESC'          
                
END          
            
IF @SortType = 2          
                
BEGIN          
                    
SET @new_order1 = ' orDER BY ' + @PrimaryKey + ' DESC'          
                    
SET @new_order2 = ' orDER BY ' + @PrimaryKey + ' ASC'          
                
END          
        
END          
    
ELSE          
        
BEGIN          
            
SET @new_order1 = ' orDER BY ' + @Order          
        
END          
    
    
IF @SortType = 3 AND  CHARINDEX(','+@PrimaryKey+' ',','+@Order)>0          
    
BEGIN          
        
SET @new_order1 = ' orDER BY ' + @Order          
        
SET @new_order2 = @Order + ','          
        
SET @new_order2 = REPLACE(REPLACE(@new_order2,'ASC,','{ASC},'),'DESC,','{DESC},')          
        
SET @new_order2 = REPLACE(REPLACE(@new_order2,'{ASC},','DESC,'),'{DESC},','ASC,')          
        
SET @new_order2 = ' orDER BY ' + SUBSTRING(@new_order2,1,LEN(@new_order2)-1)          
        
IF @FieldList <> '*'          
            
BEGIN          
                
SET @new_order3 = REPLACE(REPLACE(@Order + ',','ASC,',','),'DESC,',',')          
                
SET @FieldList = ',' + @FieldList          
                
WHILE CHARINDEX(',',@new_order3)>0          
                    
BEGIN          
                        
IF CHARINDEX(SUBSTRING(','+@new_order3,1,CHARINDEX(',',@new_order3)),','+@FieldList+',')>0          
                            
BEGIN          
                                
SET @FieldList =          
                                
@FieldList + ',' + SUBSTRING(@new_order3,1,CHARINDEX(',',@new_order3))          
                            
END          
                        
SET @new_order3 =          
                        
SUBSTRING(@new_order3,CHARINDEX(',',@new_order3)+1,LEN(@new_order3))          
                    
END          
                
SET @FieldList = SUBSTRING(@FieldList,2,LEN(@FieldList))          
            
END          
        
END     
         
    
SET @SqlCount = 'Select @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/'          
    
+ CAST(@PageSize AS VARCHAR)+') FROM (Select * FROM ' + @TableName + @new_where1+') AS T'          
    
IF @RecorderCount  = 0          
        
BEGIN          
            
EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT',          
            
@TotalCount OUTPUT,@TotalPageCount OUTPUT          
        
END          
    
ELSE          
        
BEGIN          
            
Select @TotalCount = @RecorderCount        
        
END          
    
IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)          
        
BEGIN          
            
SET @PageIndex =  CEILING((@TotalCount+0.0)/@PageSize)          
        
END          
    
IF @PageIndex = 1 or @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize)          
        
BEGIN          
            
IF @PageIndex = 1 --返回第一页数据          
                BEGIN          
                    
SET @Sql = 'Select * FROM (Select TOP ' + STR(@PageSize+ ' ' + @FieldList + ' FROM '          
                    
+ @TableName + @new_where1 + @new_order1 +') AS TMP ' + @new_order1    
                
END          
            
IF @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize)  --返回最后一页数据          
                BEGIN          
                    
SET @Sql = 'Select TOP ' + STR(@PageSize+ ' ' + @FieldList + ' FROM ('          
                    
+ 'Select TOP ' + STR(ABS(@PageSize*@PageIndex-@TotalCount-@PageSize))          
                    
+ ' ' + @FieldList + ' FROM '          
                    
+ @TableName + @new_where1 + @new_order2 + ' ) AS TMP '          
                    
+ @new_order1          
                
END          
        
END          
    
ELSE      
            
        
BEGIN          
        
IF @SortType = 1  --仅主键正序排序          
            BEGIN          
                
IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索          
                    BEGIN          
                        
SET @Sql = 'Select TOP ' + STR(@PageSize+ ' ' + @FieldList + ' FROM '          
                        
+ @TableName + @new_where2 + @PrimaryKey + ' > '          
                        
+ '(Select MAX(' + @PrimaryKey + ') FROM (Select TOP '          
                        
+ STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey          
                        
+ ' FROM ' + @TableName          
                        
+ @new_where1 + @new_order1 +' ) AS TMP) '+ @new_order1          
                    
END          
                
ELSE  --反向检索          
                    BEGIN          
                        
SET @Sql = 'Select TOP ' + STR(@PageSize+ ' ' + @FieldList + ' FROM ('          
                        
+ 'Select TOP ' + STR(@PageSize+ ' '          
                        
+ @FieldList + ' FROM '          
                        
+ @TableName + @new_where2 + @PrimaryKey + ' < '          
                        
+ '(Select MIN(' + @PrimaryKey + ') FROM (Select TOP '         
                        
+ STR(@TotalCount-@PageSize*@PageIndex+ ' ' + @PrimaryKey          
                        
+ ' FROM ' + @TableName          
                        
+ @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2          
                        
+ ' ) AS TMP ' + @new_order1          
                    
END          
            
END          
        
IF @SortType = 2  --仅主键反序排序          
            BEGIN          
                
IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索          
                    BEGIN          
                        
SET @Sql = 'Select TOP ' + STR(@PageSize+ ' ' + @FieldList + ' FROM '          
                        
+ @TableName + @new_where2 + @PrimaryKey + ' < '          
                        
+ '(Select MIN(' + @PrimaryKey + ') FROM (Select TOP '          
                        
+ STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey          
                        
+' FROM '+ @TableName          
                        
+ @new_where1 + @new_order1 + ') AS TMP) '+ @new_order1          
                    
END          
                
ELSE  --反向检索          
                    BEGIN          
                        
SET @Sql = 'Select TOP ' + STR(@PageSize+ ' ' + @FieldList + ' FROM ('          
                        
+ 'Select TOP ' + STR(@PageSize+ ' '          
                        
+ @FieldList + ' FROM '          
                        
+ @TableName + @new_where2 + @PrimaryKey + ' > '          
                        
+ '(Select MAX(' + @PrimaryKey + ') FROM (Select TOP '          
                        
+ STR(@TotalCount-@PageSize*@PageIndex+ ' ' + @PrimaryKey          
                        
+ ' FROM ' + @TableName          
                        
+ @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2          
                        
+ ' ) AS TMP ' + @new_order1          
                    
END          
            
END          
        
IF @SortType = 3  --多列排序,必须包含主键,且放置最后,否则不处理          
            BEGIN          
                
IF CHARINDEX(',' + @PrimaryKey + ' ',',' + @Order= 0          
                    
BEGIN PRINT('ERR_02'RETURN END          
                    
IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索          
                        BEGIN          
                            
SET @Sql = 'Select TOP ' + STR(@PageSize+ ' ' + @FieldList + ' FROM ( '          
                            
+ 'Select TOP ' + STR(@PageSize+ ' ' + @FieldList + ' FROM ( '          
                            
+ ' Select TOP ' + STR(@PageSize*@PageIndex+ ' ' + @FieldList          
                            
+ ' FROM ' + @TableName + @new_where1 + @new_order1 + ' ) AS TMP '          
                            
+ @new_order2 + ' ) AS TMP ' + @new_order1          
                        
END          
                    
ELSE  --反向检索          
                        BEGIN          
                            
SET @Sql = 'Select TOP ' + STR(@PageSize+ ' ' + @FieldList + ' FROM ( '          
                            
+ 'Select TOP ' + STR(@PageSize+ ' ' + @FieldList + ' FROM ( '          
                            
+ ' Select TOP ' + STR(@TotalCount-@PageSize *@PageIndex+@PageSize+ ' ' + @FieldList          
                            
+ ' FROM ' + @TableName + @new_where1 + @new_order2 + ' ) AS TMP '          
                            
+ @new_order1 + ' ) AS TMP ' + @new_order1          
                        
END          
            
END          
        
END          
    
PRINT(@SQL)          
    
EXEC(@Sql)

分享到:
评论

相关推荐

    高效分页存储过程 高效分页存储过程

    高效分页存储过程的实现对于优化数据库性能至关重要。本文将深入探讨如何创建和使用高效的分页存储过程,并针对SQL Server 2005及2010提供一个实用的例子。 首先,理解分页的基本概念。分页通常涉及到两个关键参数...

    分页存储过程 分页存储过程 分页存储过程

    分页存储过程 分页存储过程 分页存储过程 sql代码

    sql Server 通用分页存储过程

    sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程

    oracle分页存储过程

    oracle分页存储过程,oracle分页存储过程

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

    本篇文章将深入探讨MySQL中的分页存储过程及其代码调用方法。 首先,理解分页的基本概念。在网页或应用程序中,我们通常会看到“上一页”、“下一页”这样的导航,这就是分页的表现形式。分页查询通过设置每页显示...

    万能分页存储过程

    ### 万能分页存储过程知识点详解 #### 一、概述 在数据库操作中,分页查询是一项常用且重要的技术,特别是在数据量较大的场景下,能够显著提高用户体验和系统性能。本文将详细介绍一个名为“万能分页存储过程”的...

    MYSQL分页存储过程

    本文将深入解析MySQL中的分页存储过程,通过实例代码讲解其工作原理与实现步骤。 ### MySQL分页存储过程概述 分页存储过程是一种在数据库层面上实现数据分页的技术。相比应用程序级别的分页,它能更高效地处理数据...

    分页存储过程示例系统

    在IT领域,分页存储过程是数据库管理中的一个重要概念,特别是在构建大规模的Web应用程序时,如新闻系统。分页能够有效地提高用户体验,因为用户可以逐步加载数据,而不是一次性加载所有内容,这降低了服务器的负担...

    c#调用分页存储过程

    "C#调用分页存储过程"是一个常见的技术实践,它结合了C#编程语言和SQL Server的存储过程来高效地获取数据库中的分页数据。这种方法可以有效地减少网络传输的数据量,提高用户界面的响应速度,尤其是在数据量达到百万...

    Oracle 分页存储过程 终极版

    "Oracle分页存储过程 终极版"旨在提供一个高效、灵活的解决方案,以应对各种分页查询的需求。这个存储过程优化了性能,并支持各种条件筛选和排序,使得在海量数据中进行分页操作变得更为便捷。 首先,理解分页的...

    效率高的分页存储过程实现的分页

    本文将深入探讨如何通过使用存储过程来实现高效的分页存储过程,特别是针对ASP.NET应用程序。 标题 "效率高的分页存储过程实现的分页" 提到的是一种优化数据检索的技术。在ASP.NET开发中,GridView控件是常用的数据...

    通用分页存储过程

    ### 通用分页存储过程知识点解析 #### 一、存储过程概述 在数据库管理系统中,存储过程是一种预先编译并存储在数据库中的SQL程序。它能够接收参数,并根据这些参数执行复杂的逻辑操作,如数据查询、更新等。通过...

    sqlserver 分页存储过程

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

    Oracle分页存储过程

    oracle分页存储过程详细的编码 可直接使用 拿去使用吧

    C#调用分页存储过程实例

    本文将深入探讨如何使用C#语言调用SQL Server的分页存储过程,帮助开发者更高效地处理大量数据。 首先,理解分页查询的概念。分页查询是一种在大数据集上进行有效检索的方法,它允许用户按需加载一定数量的数据,而...

    分页存储过程 存储过程分页

    分页存储过程 分页存储过程分页存储过程分页存储过程

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

    二、SQL Server的分页存储过程 在SQL Server中,可以使用`OFFSET`和`FETCH NEXT`语句实现分页。下面是一个简单的分页存储过程示例: ```sql CREATE PROCEDURE [dbo].[usp_GetPagedData] @TableName NVARCHAR(128)...

Global site tag (gtag.js) - Google Analytics