程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 用DataReader分頁與幾種傳統的分頁方法的比較(3)

用DataReader分頁與幾種傳統的分頁方法的比較(3)

編輯:關於C語言

3. 通用分頁存儲過程

這個存儲過程的出處:

http://www.cnblogs.com/Tracy-Chuang/archive/2006/10/16/530125.Html

我稍微改了一點,去掉了一些功能,方便測試。

這個存儲過程有一些缺點,比如不支持多字段主鍵,重復鍵的處理看似也有問題,不排序也不可以。 單純從效率看,

還是可以的。

if exists (select * from sysobjects where id = object_id('[spCommonPageData]') and type = 'p')
   drop procedure [spCommonPageData]
GO
--http://www.cnblogs.com/Tracy-Chuang/archive/2006/10/16/530125.Html

-- =============================================
-- Author: <張婷婷>
-- Create date: <2006-08-24>
-- Description: <通用分頁存儲過程>
-- =============================================
Create PROCEDURE [dbo].[spCommonPageData]
@Select NVARCHAR(500),  -- 要查詢的列名,用逗號隔開(Select後面From前面的內容)
@From NVARCHAR(200),  -- From後的內容
@Where NVARCHAR(500) = NULL, -- Where後的內容
@OrderBy NVARCHAR(100) = NULL, -- 排序字段
@Key NVARCHAR(50),  -- 分頁主鍵
@Page INT,   -- 當前頁 ***計數從1開始***
@PageSize INT   -- 每頁大小
AS
BEGIN
SET NOCOUNT ON;

Declare @Sql nVarchar(1000), @Sql2 NVARCHAR(500)

--Alter By Tracy.Chuang 2006-08-21更改分頁算法,采用比較最大值的方法
Set @Sql=
'Select Top '+Cast(@PageSize As
nVarchar(10))+' '+@Select+ ' From '+@From+ ' Where '+Case
IsNull(@Where,'') When '' Then '' Else @Where+' And ' End+
@Key+' >( Select ISNULL(MAX('+@Key+'), 0) AS MaxID
   From (Select Top '+Cast(@PageSize*(@Page-1) As Varchar(10))+'
'+@Key+
    ' From '+@From+
    Case IsNull(@Where,'') When '' Then '' Else ' Where '+@Where End+
    ' Order By '+@Key+') As T)'+
' Order By '+@Key+Case IsNull(@OrderBy,'') When '' Then '' Else
','+@OrderBy End

Exec(@Sql)
END

四種方法的效率比較。只做了一種條件下測試,其他條件大家有興趣可以自己測。

PageSize = 10, 記錄總數 100萬,時間單位為毫秒

分頁方法 第1頁 第10頁 第100頁 第1000頁 第10000頁 第100000頁 二次 Top 4 7 404 28 271 3926 ROW_NUMBER 1 1 2 12 108 3594 通用分頁 1 1 1 10 82 3487 DataReader 0 0 1 9 91 3380
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved