拋棄以往分頁方式,改用ROW_NUMBER()加BETWEEN方式的分頁儲存過程,特此分享
/**********************************************************************************************
********************通過指定的條件分頁查詢資料表【TableName
or
ViewName】記錄******************
**********************************************************************************************/
IF
EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id
(N'[dbo].[SjjPagination]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP
PROCEDURE [dbo].[SjjPagination]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--引數說明
-------------------------------------------------------------
/*
*
@tblName ----要顯示的表或多個表的連線
* @fldName ----要查詢出的欄位列表,*表示全部欄位
*
@pageSize ----每頁顯示的記錄個數
* @pageIndex ----要顯示那一頁的記錄
*
@fldSort ----排序欄位列表或條件,如:id desc (多個id desc,dt asc)
*
@strCondition ----查詢條件,不需where
* @pageCount ----查詢結果分頁後的總頁數
*
@RecordCount ----查詢到的總記錄數
* @UsedTime ----耗時測試時間差
*
@strSql ----最後返回的SQL語句
*/
CREATE PROCEDURE
[dbo].[SjjPagination]
(
@tblName NVARCHAR(MAX),
@fldName
NVARCHAR(MAX),
@pageSize INT,
@pageIndex INT,
@fldSort
NVARCHAR(MAX),
@strCondition NVARCHAR(MAX),
@pageCount INT
OUTPUT,
@RecordCount INT OUTPUT,
@UsedTime INT OUTPUT,
@strSql
nvarchar(max) = '' OUTPUT
)
AS
SET NOCOUNT ON
DECLARE @startRow
int, @endRow INT ----用於存放起始值與結束值
DECLARE @timediff
DATETIME ----用於存放時間差值
DECLARE @SqlCounts
NVARCHAR(MAX) ----用於存放總記錄數查詢語句
DECLARE @strTmp
NVARCHAR(MAX) ----用於存放查詢語句
DECLARE @strWhere
NVARCHAR(MAX) ----用於存放查詢條件
SELECT @timediff =
getdate() ----設定開始時間
SET @startRow = (@pageIndex - 1) * @pageSize +
1 ----設定起始值
SET @endRow = @startRow + @pageSize -
1 ----設定結束值
----設定總記錄數查詢語句----
IF @strCondition is null or
@strCondition='' ----沒有設定查詢條件
BEGIN
SET @SqlCounts = 'SELECT
@RecordCount = COUNT(*) FROM ' +
@tblName
END
ELSE ----有設定查詢條件
BEGIN
SET @strWhere = ' WHERE
' + @strCondition
SET @SqlCounts = 'SELECT @RecordCount = COUNT(*) FROM '
+ @tblName + @strWhere
END
----取得查詢結果總數量-----
exec sp_executesql
@SqlCounts,N'@RecordCount int out ',@RecordCount out
declare @tmpCounts int
if @RecordCount = 0
set @tmpCounts = 1
else
set @tmpCounts
= @RecordCount
----取得分頁總數 ----
set
@pageCount=(@tmpCounts+@pageSize-1)/@pageSize
----開始分頁計算並取出相應資料----
----SELECT
* FROM (SELECT *,ROW_NUMBER() OVER (ORDER BY contnet_keyword_addDate DESC) AS
RowNumber FROM Public_content_keyword ) T WHERE T.RowNumber BETWEEN @startRow
AND @endRow
IF @pageIndex = 1
BEGIN
IF @strCondition is null or
@strCondition='' ----沒有設定顯示條件
BEGIN
SET @strTmp = 'SELECT TOP ' +
CAST(@pageSize as VARCHAR(max)) + ' ' + @fldName + ' FROM ' +
@tblName
END
ELSE ----有設定查詢條件
BEGIN
SET @strTmp =
'SELECT TOP ' + CAST(@pageSize as VARCHAR(max)) + ' ' + @fldName + ' FROM ' +
@tblName + @strWhere
END
END
ELSE
BEGIN
IF
@strCondition is null or @strCondition='' ----沒有設定顯示條件
BEGIN
SET
@strTmp = 'SELECT ' + @fldName + ' FROM (SELECT ' + @fldName + ',ROW_NUMBER()
OVER (ORDER BY ' + @fldSort + ') AS RowNumber FROM '+ @tblName +') T WHERE
T.RowNumber BETWEEN ' + CAST(@startRow as VARCHAR(max)) + ' AND ' + CAST(@endRow
as VARCHAR(max))
END
ELSE ----有設定查詢條件
BEGIN
SET
@strTmp = 'SELECT ' + @fldName + ' FROM (SELECT ' + @fldName + ',ROW_NUMBER()
OVER (ORDER BY ' + @fldSort + ') AS RowNumber FROM '+ @tblName + @strWhere +') T
WHERE T.RowNumber BETWEEN ' + CAST(@startRow as VARCHAR(max)) + ' AND ' +
CAST(@endRow as VARCHAR(max))
END
END
------返回查詢結果-----
SET
@strSql = @strTmp
EXEC(@strTmp)
SET @UsedTime =
DATEDIFF(ms,@timediff,GETDATE())
SET NOCOUNT OFF
GO
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-616724/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 拋磚引玉——通用分頁儲存過程儲存過程
- 分頁儲存過程儲存過程
- 實用單表千萬級分頁儲存過程一(不敢獨享,特此分享)儲存過程
- 實用單表千萬級分頁儲存過程二(不敢獨享,特此分享)儲存過程
- SQL 分頁儲存過程SQL儲存過程
- 通用分頁儲存過程儲存過程
- sql儲存過程分頁SQL儲存過程
- SqlServer-儲存過程分頁SQLServer儲存過程
- (SQL Server)分頁的儲存過程SQLServer儲存過程
- 簡單的儲存過程分頁儲存過程
- 簡單的分頁儲存過程儲存過程
- oracle儲存過程分頁程式碼Oracle儲存過程
- 基於ROWCOUNT的分頁儲存過程儲存過程
- 儲存過程分頁 Ado.Net分頁 EF分頁 滿足90%以上儲存過程
- Sql儲存過程分頁--臨時表儲存SQL儲存過程
- sqlserver儲存過程實現多表分頁SQLServer儲存過程
- 分頁控制元件及儲存過程控制元件儲存過程
- [MSSQL]mssql海量高效分頁儲存過程SQL儲存過程
- ORACLE高效分頁儲存過程程式碼Oracle儲存過程
- 兩種SQL分頁方法儲存過程和遊標儲存過程SQL儲存過程
- SQL Server 儲存過程的經典分頁(轉)SQLServer儲存過程
- 使用儲存過程實現分頁列印 (轉)儲存過程
- SQLServer 2005通用分頁儲存過程SQLServer儲存過程
- SQL SERVER 2005分頁儲存過程SQLServer儲存過程
- asp.net分頁控制元件AspNetPager的使用,使用傳統分頁和儲存過程分頁ASP.NET控制元件儲存過程
- 完整的分頁儲存過程以及c#呼叫方法儲存過程C#
- 一個比較不錯的儲存過程分頁儲存過程
- asp.net利用儲存過程分頁程式碼ASP.NET儲存過程
- 可用。儲存分頁
- SQL Server 2000 的分頁查詢(儲存過程)SQLServer儲存過程
- asp.net分頁的SQL語句及儲存過程ASP.NETSQL儲存過程
- MyBatis實現分頁的方式MyBatis
- 三種SQL分頁方式SQL
- 通用的SQL Server資料庫查詢分頁儲存過程SQLServer資料庫儲存過程
- 支援DISTINCT的通用分頁儲存過程(SQL2005)儲存過程SQL
- SQL2000分頁儲存過程,針對表,2005有自帶的row_numberSQL儲存過程
- 淺述asp.net海量分頁資料儲存過程ASP.NET儲存過程
- Oracle分頁(limit方式的運用)OracleMIT