`
MINGMING_0302
  • 浏览: 22433 次
  • 性别: 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 

分享到:
评论

相关推荐

    存储过程通用分页procedure

    几乎可以用到每一个需要查询分页的情况,目前还没有发现不能完成分页的情况

    mysql通用存储过程sql脚本

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

    Sqlserver2000经典脚本

    ├─第07章 │ │ 7.1 splitpage.asp │ │ 7.2.1 TOP n 实现的通用分页存储过程.sql │ │ 7.2.2 字符串缓存实现的通用分页存储过程.sql │ │ 7.2.3 临时表缓存实现的通用分页存储过程.sql...

    经典SQL脚本大全

    │ │ 7.2.3 临时表缓存实现的通用分页存储过程.sql │ │ 7.2.4 使用系统存储过程实现的通用分页存储过程.sql │ │ 7.3.1 实现随机分页的通用分页存储过程.sql │ │ 7.3.2 根据分类表实现的分页存储过程.sql │ ...

    高性能MySQL(第3版).part2

    7.4.1存储过程和函数278 7.4.2触发器279 7.4.3事件281 7.4.4在存储程序中保留注释283 7.5游标283 7.6绑定变量284 7.6.1绑定变量的优化286 7.6.2SQL接口的绑定变量286 7.6.3绑定变量的限制288 7.7用户自定义...

    PHP程序开发范例宝典III

    实例234 使用子查询作派生的表 362 实例235 使用子查询作表达式 364 实例236 使用子查询关联数据 365 8.13 联合语句 367 实例237 多表联合查询 367 实例238 对联合查询后的结果进行排序 368 实例239 ...

    Access 2000数据库系统设计(PDF)---001

    22210.3.2 向一个表添加固定值查找列表 22510.4 向表或者查询添加子数据表 22610.4.1 表子数据表 22710.4.2 查询子数据表 22810.5 外连接、自连接和Theta连接 23010.5.1 创建外连接 23010.5.2 创建自连接 23110.5.3 ...

    Access 2000数据库系统设计(PDF)---002

    22210.3.2 向一个表添加固定值查找列表 22510.4 向表或者查询添加子数据表 22610.4.1 表子数据表 22710.4.2 查询子数据表 22810.5 外连接、自连接和Theta连接 23010.5.1 创建外连接 23010.5.2 创建自连接 23110.5.3 ...

    Access 2000数据库系统设计(PDF)---018

    22210.3.2 向一个表添加固定值查找列表 22510.4 向表或者查询添加子数据表 22610.4.1 表子数据表 22710.4.2 查询子数据表 22810.5 外连接、自连接和Theta连接 23010.5.1 创建外连接 23010.5.2 创建自连接 23110.5.3 ...

    Access 2000数据库系统设计(PDF)---003

    22210.3.2 向一个表添加固定值查找列表 22510.4 向表或者查询添加子数据表 22610.4.1 表子数据表 22710.4.2 查询子数据表 22810.5 外连接、自连接和Theta连接 23010.5.1 创建外连接 23010.5.2 创建自连接 23110.5.3 ...

    Access 2000数据库系统设计(PDF)---011

    22210.3.2 向一个表添加固定值查找列表 22510.4 向表或者查询添加子数据表 22610.4.1 表子数据表 22710.4.2 查询子数据表 22810.5 外连接、自连接和Theta连接 23010.5.1 创建外连接 23010.5.2 创建自连接 23110.5.3 ...

    Access 2000数据库系统设计(PDF)---020

    22210.3.2 向一个表添加固定值查找列表 22510.4 向表或者查询添加子数据表 22610.4.1 表子数据表 22710.4.2 查询子数据表 22810.5 外连接、自连接和Theta连接 23010.5.1 创建外连接 23010.5.2 创建自连接 23110.5.3 ...

    Access 2000数据库系统设计(PDF)---009

    22210.3.2 向一个表添加固定值查找列表 22510.4 向表或者查询添加子数据表 22610.4.1 表子数据表 22710.4.2 查询子数据表 22810.5 外连接、自连接和Theta连接 23010.5.1 创建外连接 23010.5.2 创建自连接 23110.5.3 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例262 使客户端浏览器支持COOKIE 344 5.2 SESSION 345 实例263 掌控登录用户的权限 346 实例264 屏蔽页面刷新对计数器的影响 347 实例265 在不同页面之间传递数据 348 实例266 SESSION购物车 350 实例267 解决...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例262 使客户端浏览器支持COOKIE 344 5.2 SESSION 345 实例263 掌控登录用户的权限 346 实例264 屏蔽页面刷新对计数器的影响 347 实例265 在不同页面之间传递数据 348 实例266 SESSION购物车 350 实例267 解决...

    Access 2000数据库系统设计(PDF)---015

    22210.3.2 向一个表添加固定值查找列表 22510.4 向表或者查询添加子数据表 22610.4.1 表子数据表 22710.4.2 查询子数据表 22810.5 外连接、自连接和Theta连接 23010.5.1 创建外连接 23010.5.2 创建自连接 23110.5.3 ...

    Access 2000数据库系统设计(PDF)---012

    22210.3.2 向一个表添加固定值查找列表 22510.4 向表或者查询添加子数据表 22610.4.1 表子数据表 22710.4.2 查询子数据表 22810.5 外连接、自连接和Theta连接 23010.5.1 创建外连接 23010.5.2 创建自连接 23110.5.3 ...

Global site tag (gtag.js) - Google Analytics