`
MINGMING_0302
  • 浏览: 23460 次
  • 性别: Icon_minigender_2
文章分类
社区版块
存档分类
最新评论

通用分页存储过程,支持子查询或联表查询

阅读更多
代码

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->/****** 对象:  StoredProcedure [dbo].[p_generalTablePage]    脚本日期: 12/30/2009 13:25:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

 

-- =============================================
-- Author:        dean
-- Create date: 2008-06-26
-- Description:    page
-- =============================================
CREATE PROCEDURE [dbo].[p_generalTablePage]
@strTbName        varchar(400)    --表名
,@strFeilds        varchar(400)    -- 显示字段
,@strOrder        varchar(200)    -- 排序字段
,@strWhere        varchar(400)    -- 查询条件 (注意: 不要加where)
,@PageSize        int = 15        -- 页尺寸
,@PageIndex        int = 1            -- 当前页码
,@masterFeilds    varchar(50)        -- 主关键字
,@OrderType        int = 0            -- 设置排序类型, 非 0 值则降序
,@RecordCount    int output        -- 返回记录数
,@totalPage        int output        -- 返回总页数
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @strSQLCnt    nvarchar(3000)        -- 统计语句
            ,@strSQL    varchar(5000)       -- 主语句
    
    IF @OrderType != 0
        BEGIN
            if @strOrder != '' And @strOrder is not null
                set @strOrder = 'order by '+@strOrder+','+@masterFeilds+' desc'
            else
                set @strOrder = 'order by '+@masterFeilds+' desc'
        END
    ELSE
        BEGIN
            if @strOrder != '' And @strOrder is not null
                set @strOrder = 'order by '+@strOrder+','+@masterFeilds+' asc'
            else
                set @strOrder = 'order by '+@masterFeilds+' asc'
        END

    IF @strFeilds = '' or @strFeilds is Null
        SET @strFeilds = '*'

    
    
    IF @strWhere != ''
        SET @strSQLCnt = 'SELECT @RecordCount = COUNT(*) FROM (SELECT '+ @strFeilds +' FROM '+ @strTbName + ' WHERE ' + @strWhere +') AS tmpWebListTable'
    ELSE
        SET @strSQLCnt = 'SELECT @RecordCount = COUNT(*) FROM '+ @strTbName

    EXEC sp_executesql @strSQLCnt,N'@RecordCount int output',@RecordCount output
    SET @totalPage = dbo.MyTopInt(@RecordCount,@PageSize)

    IF @PageIndex >  @totalPage
        SET @PageIndex = @totalPage
    IF @PageIndex < 1
        SET @PageIndex = 1
    -- Insert statements for procedure here

    IF @strWhere != '' And @strWhere is not null
        SET @strSQL = 'select * from (select '+@strFeilds+',row_number() over ('+ @strOrder +') AS row from '+@strTbName+' WHERE '+@strWhere+') deanTmpTable where row between '+ltrim(str(@PageSize*(@PageIndex-1)+1))+' and '+ltrim(str(@PageSize*@PageIndex))
    ELSE
        SET @strSQL = 'select * from (select '+@strFeilds+',row_number() over ('+ @strOrder +') AS row from '+@strTbName+') deanTmpTable where row between '+ltrim(str(@PageSize*(@PageIndex-1)+1))+' and '+ltrim(str(@PageSize*@PageIndex))
    --PRINT @RecordCount
    PRINT (@strSQL) 
    EXEC (@strSQL)
END

 

 

 

配合分页存储过程使用的标值量函数,用以计算总页数

 

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
/****** 对象:  UserDefinedFunction [dbo].[MyTopInt]    脚本日期: 12/30/2009 13:12:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:        dean
-- Create date: <Create Date, ,>
-- Description:    计算总页数
-- =============================================

CREATE FUNCTION [dbo].[MyTopInt]
(
    @tRs    int,
    @ps        int
)
RETURNS int
AS
BEGIN
    DECLARE @t1 int
    IF @tRs > 0 AND @ps > 0
    BEGIN
        IF @tRs % @ps = 0 
            SET @t1 = FLOOR(@tRs/@ps)
        ELSE
            SET @t1 = FLOOR(@tRs/@ps)+1
    END
    ELSE
        SET @t1 = 0 
    RETURN @t1
END

 

 

 

这是我的分页存储过程,应用过几个项目了,也改过很多次,支持子查询或联表查询。特发出来交流一下,大家请P。

 

 

eg:简单的实例



Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->DECLARE    @return_value int,
        @RecordCount int,
        @totalPage int

EXEC    @return_value = [dbo].[p_generalTablePage]
        @strTbName = N'webTable',
        @strFeilds = NULL,
        @strOrder = NULL,
        @strWhere = NULL,
        @PageSize = 20,
        @PageIndex = 1,
        @masterFeilds = N'wid',
        @OrderType = 1,
        @RecordCount = @RecordCount OUTPUT,
        @totalPage = @totalPage OUTPUT

SELECT    @RecordCount as N'@RecordCount',
        @totalPage as N'@totalPage'

SELECT    'Return Value' = @return_value

GO

  

稍稍复杂点



Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->DECLARE    @return_value int,
        @RecordCount int,
        @totalPage int

EXEC    @return_value = [dbo].[p_generalTablePage]
        @strTbName = N'webTable',
        @strFeilds = N'wid,shortName,url,resume',
        @strOrder = N'City desc,shortname desc',
        @strWhere = N'siteid=34',
        @PageSize = 20,
        @PageIndex = 1,
        @masterFeilds = N'wid',
        @OrderType = 1,
        @RecordCount = @RecordCount OUTPUT,
        @totalPage = @totalPage OUTPUT

SELECT    @RecordCount as N'@RecordCount',
        @totalPage as N'@totalPage'

SELECT    'Return Value' = @return_value

GO

 

 

 

联表查询



Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
DECLARE    @return_value int,
        @RecordCount int,
        @totalPage int

EXEC    @return_value = [dbo].[p_generalTablePage]
        @strTbName = N'webTable inner join SubSite on webTable.siteid = SubSite.ssid',
        @strFeilds = N'webTable.wid,webTable.shortName,webTable.url,webTable.resume',
        @strOrder = N'City desc,shortname desc',
        @strWhere = N'siteid=34',
        @PageSize = 20,
        @PageIndex = 1,
        @masterFeilds = N'wid',
        @OrderType = 1,
        @RecordCount = @RecordCount OUTPUT,
        @totalPage = @totalPage OUTPUT

SELECT    @RecordCount as N'@RecordCount',
        @totalPage as N'@totalPage'

SELECT    'Return Value' = @return_value

GO

 

 

 

内嵌子查询



Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->DECLARE    @return_value int,
        @RecordCount int,
        @totalPage int

EXEC    @return_value = [dbo].[p_generalTablePage]
        @strTbName = N'(select * from webTable) s',--子表
        @strFeilds = N'wid,shortName,url,resume',
        @strOrder = N'City desc,shortname desc',
        @strWhere = N'siteid=34',
        @PageSize = 20,
        @PageIndex = 1,
        @masterFeilds = N'wid',
        @OrderType = 1,
        @RecordCount = @RecordCount OUTPUT,
        @totalPage = @totalPage OUTPUT

SELECT    @RecordCount as N'@RecordCount',
        @totalPage as N'@totalPage'

SELECT    'Return Value' = @return_value

GO

 

 

转自 http://www.cnblogs.com/rockdean/articles/rockdean.html 

分享到:
评论

相关推荐

    通用分页存储过程+通用分页存储过程

    根据提供的文件信息,我们可以了解到这段代码是用于创建一个SQL Server中的通用分页存储过程,名为`pagination3`。此存储过程旨在提供一种灵活且高效的方式来处理数据库查询中的分页问题,使得开发人员能够轻松地在...

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

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

    通用ORACLE存储过程实现分页和查询

    创建一个通用的分页存储过程,我们需要考虑以下参数: 1. 输入查询(通常作为字符串参数传递):这是用户要执行的查询,不包含分页条件。 2. 开始行号(start_row):指定要开始显示的行号,通常从1开始。 3. 行数...

    几款通用的sql分页存储过程

    ### 几款通用的SQL分页存储过程:深入解析与应用 在数据库操作中,分页查询是一项常见的需求,尤其当数据量庞大时,合理的分页可以极大地提高查询效率和用户体验。本文将深入分析两款通用的SQL分页存储过程,分别...

    千万级分页存储过程 实现对表的数据分页 速度非常快

    千万级分页存储过程的核心在于利用索引进行高效的数据定位与检索,通过SQL Server的存储过程(Stored Procedure)实现对大数据表的快速分页查询。 ### 二、SQL Server中的千万级分页实现方法 #### 1. **使用存储...

    存储过程通用分页procedure

    ### 存储过程通用分页Procedure详解 #### 标题:存储过程通用分页Procedure 此标题明确指出了本文档的主要内容是关于一种通用的存储过程实现方式,用于数据库中的分页查询。分页是在数据库操作中非常常见的一种...

    oracle和mssql分页存储过程-均通用

    要实现Oracle和MSSQL的通用分页存储过程,可以使用动态SQL。首先,根据数据库类型选择合适的分页语句,然后将分页参数(如页号、每页记录数)传入存储过程。这需要对两种数据库的语法有一定了解,并且可能需要处理...

    DB 2通用分页存储过程

    DB2的通用分页存储过程是数据库管理系统中用于高效处理大量数据的一种技术,它允许用户在不加载整个数据集的情况下,只获取特定页面的数据。在DB2中,这个功能通过自定义存储过程实现,可以适应各种不同的查询需求,...

    一个通用的分页存储过程与在aspx页面中调用的方法

    ### 通用分页存储过程与ASPX页面中的调用方法 #### 一、分页存储过程概述 在数据库操作中,分页是非常常见且重要的功能之一。尤其在处理大量数据时,分页能够显著提高用户体验并减少服务器负载。本文介绍了一个...

    通用高效的分页存储过程(适合Asp.net分页用)效率很高

    【通用高效的分页存储过程(适合Asp.net分页用)效率很高】 在Asp.net开发中,分页是常见的需求,特别是在处理大数据量时,高效分页至关重要。传统的ADO.NET记录集分页方法,依赖于游标,适用于小数据量场景。然而...

    sqlserver分页存储过程+gridview实例+通用方法(sqlserverr通用)

    在SQL Server 2000中,由于不支持`OFFSET-FETCH`,我们可以使用`ROW_NUMBER()`函数配合子查询来实现分页效果。 以下是一个简单的SQL Server 2000分页存储过程示例: ```sql CREATE PROCEDURE [dbo].[usp_...

    基于Sql Server通用分页存储过程的解决方法

    本文将深入探讨基于Sql Server的通用分页存储过程的实现方法,特别针对Sql Server 2005及以上版本。 在SQL Server 2000中,由于缺乏内置的分页功能,实现分页通常比较复杂,效率也不高,尤其是在数据量达到十万级别...

    Sql通用查询存储过程

    4. **性能优化**:合理使用索引,避免在动态SQL中使用复杂的子查询或联合操作等可能影响性能的因素。 综上所述,SQL通用查询存储过程通过灵活的参数配置和动态SQL构建机制,在提高开发效率的同时也增强了系统的扩展...

    mysql通用存储过程sql脚本

    mysql通用存储过程sql脚本,支持多表,子查询,高级查询 分页

    通用分页存储过程,源码共享,大家共同完善

    【通用分页存储过程】是数据库管理中一种常见的技术,用于在大量数据中实现高效的分页查询。在大型数据集的展示中,分页能够帮助用户逐步加载和浏览数据,而不是一次性加载所有记录,从而提高用户体验和系统性能。...

    SQL通用存储过程分页,支持多表联合

    【SQL通用存储过程分页】是指在数据库管理中,通过创建一个存储过程来实现对多表数据的分页查询。这种存储过程可以适应多种不同表结构的查询需求,避免为每张表单独编写分页查询的存储过程,提高了开发效率。在本例...

    C# winform程序实现分页的方法

    1. **子查询法**:通过子查询的方式获取特定范围内的数据。 ```sql SELECT TOP 10 * FROM TestTable WHERE (ID &gt; (SELECT MAX(id) FROM (SELECT TOP 20 id FROM TestTable ORDER BY id) AS T)) ORDER BY ID ```...

    sql语句写分页通用代码

    这时可以尝试使用其他的分页策略,如`ROW_NUMBER()`窗口函数(在支持该功能的数据库如SQL Server中)或子查询结合LIMIT/OFFSET。 通过以上分析,我们可以看出,编写SQL语句实现分页通用代码需要充分理解数据库查询...

Global site tag (gtag.js) - Google Analytics