支援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;
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 通用分頁儲存過程儲存過程
- SQLServer 2005通用分頁儲存過程SQLServer儲存過程
- 拋磚引玉——通用分頁儲存過程儲存過程
- 分頁儲存過程儲存過程
- SQL 分頁儲存過程SQL儲存過程
- sql儲存過程分頁SQL儲存過程
- 通用的SQL Server資料庫查詢分頁儲存過程SQLServer資料庫儲存過程
- (SQL Server)分頁的儲存過程SQLServer儲存過程
- 簡單的儲存過程分頁儲存過程
- 簡單的分頁儲存過程儲存過程
- SqlServer-儲存過程分頁SQLServer儲存過程
- Sql儲存過程分頁--臨時表儲存SQL儲存過程
- 基於ROWCOUNT的分頁儲存過程儲存過程
- oracle儲存過程分頁程式碼Oracle儲存過程
- 兩種SQL分頁方法儲存過程和遊標儲存過程SQL儲存過程
- sqlserver儲存過程實現多表分頁SQLServer儲存過程
- 分頁控制元件及儲存過程控制元件儲存過程
- [MSSQL]mssql海量高效分頁儲存過程SQL儲存過程
- ORACLE高效分頁儲存過程程式碼Oracle儲存過程
- 實現小資料量和海量資料的通用分頁顯示儲存過程儲存過程
- SQL Server 儲存過程的經典分頁(轉)SQLServer儲存過程
- 使用儲存過程實現分頁列印 (轉)儲存過程
- SQL SERVER 2005分頁儲存過程SQLServer儲存過程
- 完整的分頁儲存過程以及c#呼叫方法儲存過程C#
- 一個比較不錯的儲存過程分頁儲存過程
- 儲存過程分頁 Ado.Net分頁 EF分頁 滿足90%以上儲存過程
- asp.net利用儲存過程分頁程式碼ASP.NET儲存過程
- SQL Server 2000 的分頁查詢(儲存過程)SQLServer儲存過程
- asp.net分頁的SQL語句及儲存過程ASP.NETSQL儲存過程
- [Procedure]Oracle之分頁儲存過程Oracle儲存過程
- openGauss 支援儲存過程除錯儲存過程除錯
- asp.net分頁控制元件AspNetPager的使用,使用傳統分頁和儲存過程分頁ASP.NET控制元件儲存過程
- 淺述asp.net海量分頁資料儲存過程ASP.NET儲存過程
- 簡單談基於SQL SERVER 分頁儲存過程的演進SQLServer儲存過程
- openGauss 函式及儲存過程支援函式儲存過程
- MySQL儲存過程-->長字串扯分MySql儲存過程字串
- SQL 2000 2005通用儲存過程SQL儲存過程
- asp.net SQL Server 儲存過程分頁及程式碼呼叫ASP.NETSQLServer儲存過程