支援DISTINCT的通用分頁儲存過程(SQL2005)

iSQlServer發表於2009-07-23
/****** 物件:  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;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-610005/,如需轉載,請註明出處,否則將追究法律責任。

相關文章