支持DISTINCT的通用分页存储过程(SQL2005)

/****** 对象:  StoredProcedure [dbo].[P_CommonPagination]    脚本日期: 07/22/2009 10:22:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:        
-- Create date: 2008-12-16
-- Description:    支持DISTINCT的通用分页存储过程(SQL2005)
-- =============================================
CREATE PROCEDURE [dbo].[P_CommonPagination]
(
    -- 列名称
    @Fields            NVARCHAR(MAX) = '*',
    -- 表名称
    -- 不允许为空
    @Table            NVARCHAR(MAX),
    -- 查询条件
    @Where            NVARCHAR(MAX) = '',
    -- 排序的字段
    -- 不允许为空,无排序字段时可指定主键
    @Order            NVARCHAR(MAX),
    -- 页码
    @PageIndex        INT = 1,
    -- 每页数据
    @PageSize        INT = 10,
    -- 是否使用DISTINCT
    @UseDistinct    BIT = 0,
    -- 处理动作
    -- 0表示返回查询结果和总数,1表示只返回查询结果,2表示只返回总数
    @Action            TINYINT = 0,
    -- 记录总数
    @TotalCount        BIGINT OUTPUT
)
AS

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

-- **************************
-- 未做输入参数检查
-- **************************

DECLARE @sql NVARCHAR(MAX)
DECLARE @Distinct NVARCHAR(50)

IF @Fields = ''
    SET @Fields = '*'
SET @Order = ' ORDER BY ' + @Order
IF @Where <> ''
    SET @Where = ' WHERE ' + @Where
SET @TotalCount = 0
IF @UseDistinct = 1
    SET @Distinct = ' DISTINCT '
ELSE
    SET @Distinct = ''

IF @Action <> 2
BEGIN
    -- Get Paging Data
    IF @PageIndex = 1
        SET @sql = 'SELECT ' + @Distinct + ' TOP ' + STR(@PageSize) + ' ' + @Fields + ',0 AS RowNumber FROM ' + @Table + ' ' + @Where + ' ' + @Order
    ELSE
    BEGIN
        DECLARE @BeginRowNumber    INT
        SET @BeginRowNumber = (@PageIndex - 1) * @PageSize + 1
        DECLARE @EndRowNumber    INT
        SET @EndRowNumber = @PageIndex * @PageSize

        SET @sql = 'SELECT ' + @Fields + ' FROM (SELECT ' + @Fields + ',ROW_NUMBER() OVER(' + @Order + ') AS RowNumber FROM '

        IF @UseDistinct = 1
            SET @sql = @sql + '(SELECT DISTINCT ' + @Fields + ' FROM ' + @Table + ' ' + @Where + ') AS S'
        ELSE
            SET @sql = @sql + @Table + ' ' + @Where

        SET @sql = @sql + ') AS T WHERE RowNumber BETWEEN ' + STR(@BeginRowNumber)+' AND ' + STR(@EndRowNumber) + ' ORDER BY RowNumber'
    END
    --print @sql
    EXEC SP_EXECUTESQL @sql
END

IF @Action <>1
BEGIN
    -- Get TotalCount
    SET @sql = 'SELECT @TotalCount=COUNT(1) FROM (SELECT ' + @Distinct + ' ' +@Fields+ ' FROM '+ @Table + ' ' + @Where +') AS temptable'
    --print @sql
    EXEC SP_EXECUTESQL @sql, N'@TotalCount INT OUTPUT', @TotalCount OUTPUT 
END

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

 

转载于:https://www.cnblogs.com/fm168/p/3384705.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值