實用單表千萬級分頁儲存過程一(不敢獨享,特此分享)
實用單表千萬級分頁儲存過程一(不敢獨享,特此分享)
此儲存過程只適合於主鍵查詢
意思就是其中變數@strSortKey和@strSortField必須都是主鍵,如:ID,ID desc
本儲存過程本人做了小修改
/**********************************************************************************************
********************通過指定的條件分頁查詢資料表【TableName
or
ViewName】記錄******************
**********************************************************************************************/
IF
EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id
(N'[dbo].[ThePaginationProcedureIsUsedInPrimaryKey]') AND OBJECTPROPERTY(id,
N'IsProcedure') = 1)
DROP PROCEDURE
[dbo].[ThePaginationProcedureIsUsedInPrimaryKey]
GO
--引數說明
-------------------------------------------------------------
/*
@strTable
--要顯示的表或多個表的連線
@strField --要查詢出的欄位列表,*表示全部欄位
@intTop --最多讀取記錄數
@pageSize --每頁顯示的記錄個數
@pageIndex --要顯示那一頁的記錄
@strWhere
--查詢條件,不需where
@strSortKey --用於排序的主鍵
@strSortField --用於排序,如:id desc (多個id
desc,dt asc)
@strOrderBy --排序,0-順序,1-倒序
@pageCount
--查詢結果分頁後的總頁數
@RecordCount --查詢到的總記錄數
@UsedTime --耗時測試時間差
*/
CREATE
PROCEDURE [dbo].[ThePaginationProcedureIsUsedInPrimaryKey]
@strTable
varchar(max) = '[dbo].[TableOrView]',
@strField varchar(max) =
'*',
@intTop int = max,
@pageSize int = 45,
@pageIndex int =
1,
@strWhere varchar(max) = '1=1',
@strSortKey varchar(max) =
'TbVe_id',
@strSortField varchar(max) = 'TbVe_date DESC',
@strOrderBy bit
= 1,
@pageCount int OUTPUT,
@RecordCount int OUTPUT,
@UsedTime int
OUTPUT
AS
SET NOCOUNT ON
Declare @sqlcount INT
Declare @timediff
DATETIME
select @timediff=getdate()
Begin Tran
DECLARE @sql
nvarchar(max),@where1 varchar(max),@where2 varchar(max)
IF @strWhere is null
or rtrim(@strWhere)=''
BEGIN--沒有查詢條件
SET @where1=' WHERE '
SET
@where2=' '
END
ELSE
BEGIN--有查詢條件
SET @where1=' WHERE
('+@strWhere+') AND ' --本來有條件再加上此條件
SET @where2=' WHERE ('+@strWhere+') '
--原本沒有條件而加上此條件
END
--SET @sql='SELECT @intResult=COUNT(*) FROM
'+@strTable+@where2
IF @intTop<=0
BEGIN
SET @sql='SELECT
@sqlcount=COUNT(*) FROM (select '+@strSortKey+' from '+ @strTable + @where2 +')
As tmptab'
END
ELSE
BEGIN
SET @sql='SELECT @sqlcount=COUNT(*) FROM
(select top '+ cast(@intTop as varchar(max)) +' '+@strSortKey+' from '+
@strTable + @where2 +') As tmptab'
END
--print @sql
EXEC
sp_executesql @sql,N'@sqlcount int OUTPUT',@sqlcount OUTPUT --計算總記錄數
SELECT
@pageCount=CEILING((@sqlcount+0.0)/@pageSize) --計算總頁數
SELECT @RecordCount =
@sqlcount --設定總記錄數
IF @pageIndex=1 --第一頁
BEGIN
SET @sql='SELECT TOP
'+CAST(@pageSize AS varchar(max))+' '+@strField+' FROM '+@strTable+
@where2+'ORDER BY '+ @strSortField
END
Else
BEGIN
IF
@strOrderBy=0
SET @sql='SELECT TOP '+CAST(@pageSize AS varchar(max))+'
'+@strField+ ' FROM '+@strTable+@where1+@strSortKey+'>(SELECT
MAX('+@strSortKey+') '+ ' FROM (SELECT TOP '+CAST(@pageSize*(@pageIndex-1) AS
varchar(max))+' '+
@strSortKey+' FROM '+@strTable+@where2+'ORDER BY
'+@strSortField+') t) ORDER BY '+@strSortField
ELSE
SET @sql='SELECT TOP
'+CAST(@pageSize AS varchar(max))+' '+@strField+' FROM
'+@strTable+@where1+@strSortKey+'@strSortKey+' FROM '+@strTable+@where2+'ORDER BY '+@strSortField+') t) ORDER
BY '+@strSortField+''
END
EXEC(@sql)
--print @sql
If @@Error
<> 0
Begin
RollBack Tran
Return
-1
End
Else
Begin
Commit TRAN
set @UsedTime =
datediff(ms,@timediff,getdate())
--select datediff(ms,@timediff,getdate()) as
耗時
Return @sqlcount
End
GO
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-616531/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 實用單表千萬級分頁儲存過程二(不敢獨享,特此分享)儲存過程
- 拋棄以往分頁方式,改用ROW_NUMBER()加BETWEEN方式的分頁儲存過程,特此分享儲存過程
- Sql儲存過程分頁--臨時表儲存SQL儲存過程
- 簡單的儲存過程分頁儲存過程
- 簡單的分頁儲存過程儲存過程
- 分頁儲存過程儲存過程
- SQL 分頁儲存過程SQL儲存過程
- 通用分頁儲存過程儲存過程
- sql儲存過程分頁SQL儲存過程
- sqlserver儲存過程實現多表分頁SQLServer儲存過程
- SqlServer-儲存過程分頁SQLServer儲存過程
- 使用儲存過程實現分頁列印 (轉)儲存過程
- oracle儲存過程分頁程式碼Oracle儲存過程
- (SQL Server)分頁的儲存過程SQLServer儲存過程
- 兩種SQL分頁方法儲存過程和遊標儲存過程SQL儲存過程
- 分頁控制元件及儲存過程控制元件儲存過程
- [MSSQL]mssql海量高效分頁儲存過程SQL儲存過程
- ORACLE高效分頁儲存過程程式碼Oracle儲存過程
- 基於ROWCOUNT的分頁儲存過程儲存過程
- 一個比較不錯的儲存過程分頁儲存過程
- SQLServer 2005通用分頁儲存過程SQLServer儲存過程
- 拋磚引玉——通用分頁儲存過程儲存過程
- SQL SERVER 2005分頁儲存過程SQLServer儲存過程
- 用儲存過程動態建立表儲存過程
- 簡單談基於SQL SERVER 分頁儲存過程的演進SQLServer儲存過程
- 儲存過程分頁 Ado.Net分頁 EF分頁 滿足90%以上儲存過程
- SQL Server 儲存過程的經典分頁(轉)SQLServer儲存過程
- asp.net利用儲存過程分頁程式碼ASP.NET儲存過程
- mssql 儲存過程呼叫另一個儲存過程中的結果的方法分享SQL儲存過程
- MyBatis(八) 資料庫BLOB讀寫、批量更新操作、儲存過程呼叫、分表、分頁MyBatis資料庫儲存過程
- 完整的分頁儲存過程以及c#呼叫方法儲存過程C#
- [Procedure]Oracle之分頁儲存過程Oracle儲存過程
- 實戰儲存過程排程過程儲存過程
- SQL 儲存過程裡呼叫另一個儲存過程SQL儲存過程
- Oracle儲存過程乾貨(一):儲存過程基礎Oracle儲存過程
- 淺述asp.net海量分頁資料儲存過程ASP.NET儲存過程
- SQL Server 2000 的分頁查詢(儲存過程)SQLServer儲存過程
- asp.net分頁的SQL語句及儲存過程ASP.NETSQL儲存過程