SQL Server通用分頁存儲過程

測試了下,1200000條數據,查詢不到1分鐘,而使用傳統的查詢方法,要好幾分鐘

/*分頁存儲過程
Descript:分頁存儲過程
Author:Blue.Dream
Date:2004-8-18 21:01
*/
CREATE  PROCEDURE ListPage(
@tblName  nvarchar(200),           ----要顯示的表或多個表的連接
@fldName  nvarchar(200) = '*',          ----要顯示的字段列表
@pageSize int = 10,                    ----每頁顯示的記錄個數
@page  int = 1,           ----要顯示那一頁的記錄
@pageCount int = 1 output,          ----查詢結果分頁後的總頁數
@Counts int = 1 output,           ----查詢到的記錄數
@ID  nvarchar(50),  ----主表的主鍵
@fldSort nvarchar(100) = null,          ----排序字段列表或條件
@Sort  bit = 0,           ----排序方法,0爲升序,1爲降序
@strCondition nvarchar(200) = null ----查詢條件,不需where
)
AS
SET NOCOUNT ON
Declare @sqlTmp nvarchar(1000)  ----存放動態生成的SQL語句
Declare @strTmp nvarchar(1000)  ----存放取得查詢結果總數的查詢語句
Declare @strID  nvarchar(1000)  ----存放取得查詢開頭或結尾ID的查詢語句
Declare @sqlSort nvarchar(200)  ----存放臨時生成的排序條件
Declare @intCounts int   ----要移動的記錄數
Declare @BeginID int   ----開始的ID
Declare @EndID   int   ----結束的ID

 

--------首先生成排序方法---------
if @Sort=0  --升序
begin
   if not(@fldSort is null)
  set @sqlSort = ' Order by ' + @fldSort
   else
  set @sqlSort = ' Order by ' + @ID 
end
else   --降序
begin
 if not(@fldSort is null)
  set @sqlSort = ' Order by ' + @fldSort + ' DESC' 
 else
  set @sqlSort = ' Order by ' + @ID + ' DESC '
end


--------生成查詢語句--------
--此處@strTmp爲取得查詢結果數量的語句
if @strCondition is null --沒有設置顯示條件
 begin
 set @sqlTmp =  @fldName + ' From ' + @tblName
 set @strTmp = 'select @Counts=Count(' + @ID + ') FROM '+@tblName
 set @strID = ' From ' + @tblName
 end
else
 begin
 set @sqlTmp = + @fldName + 'From ' + @tblName + ' where ' + @strCondition
 set @strTmp = 'select @Counts=Count(' + @ID + ') FROM '+@tblName + ' where ' + @strCondition
 set @strID = ' From ' + @tblName + ' where ' + @strCondition
 end
 


----取得查詢結果總數量-----
exec sp_executesql @strTmp,N'@Counts int out ',@Counts out

--取得分頁總數
if @Counts <= @pageSize
 set @pageCount = 1
else
 set @pageCount = (@Counts / @pageSize) + 1


--計算要移動的記錄數
if @page = 1
 set @intCounts = @pageSize
else
begin
 set @intCounts = (@page-1) * @pageSize + 1
end

-----取得分頁後此頁的第一條記錄的ID
set @strID = 'select @BeginID=' + @ID + ' ' + @strID

 

set @intCounts = @intCounts - @pageSize + 1
set rowcount  @intCounts
exec sp_executesql @strID,N'@BeginID int out ',@BeginID out

-----取得分頁後此頁的最後一條記錄的ID
set @intCounts = @intCounts + @pageSize - 1
print @intCounts
set rowcount  @intCounts
exec sp_executesql @strID,N'@BeginID int out ',@EndID out


------恢復系統設置-----
set rowcount  0
SET NOCOUNT ON

------返回查詢結果-----
if @strCondition is null
 set @strTmp = 'select ' + @sqlTmp + ' where ' + @ID + ' between ' + str(@BeginID) + ' and ' + str(@EndID)
else
 set @strTmp = 'select ' + @sqlTmp + ' where ' + @ID +' (between ' + str(@BeginID) + ' and ' + str(@EndID) + ')  and ' + @strCondition

if not(@sqlSort is null)
set @strTmp = @strTmp + @sqlSort
exec sp_executesql @strTmp
GO

 

該文章轉載自網絡大本營:http://www.xrss.cn/Dev/DataBase/2006511239.Html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章