C#中常用的分頁存儲(chǔ)過程小結(jié)
更新時(shí)間:2010年05月23日 01:55:07 作者:
C#中常用的分頁存儲(chǔ)過程小結(jié),需要利用存儲(chǔ)過程分頁的朋友可以參考下。
表中主鍵必須為標(biāo)識(shí)列,[ID] int IDENTITY (1,1)//每次自增一
1.分頁方案一:(利用Not In和SELECT TOP分頁)
語句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 20 id
FROM TestTable
ORDER BY id))
ORDER BY ID
SELECT TOP 頁大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 頁大小*頁數(shù) id
FROM 表
ORDER BY id))
ORDER BY ID
2.分頁方案二:(利用ID大于多少和SELECT TOP分頁)
語句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 20 id
FROM TestTable
ORDER BY id) AS T))
ORDER BY ID
SELECT TOP 頁大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 頁大小*頁數(shù) id
FROM 表
ORDER BY id) AS T))
ORDER BY ID
3.分頁方案三:(利用SQL的游標(biāo)存儲(chǔ)過程分頁)
create procedure SqlPager
@sqlstr nvarchar(4000), --查詢字符串
@currentpage int, --第N頁
@pagesize int --每頁行數(shù)
as
set nocount on
declare @P1 int, --P1是游標(biāo)的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 總頁數(shù)--,@rowcount as 總行數(shù),@currentpage as 當(dāng)前頁
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off
4.
CREATE Procedure FramWorkPage
@TableName varchar(50), --表名
@Fields varchar(5000) = '*', --字段名(全部字段為*)
@OrderField varchar(5000), --排序字段(必須!支持多字段)
@sqlWhere varchar(5000) = Null,--條件語句(不用加where)
@pageSize int, --每頁多少條記錄
@pageIndex int = 1 , --指定當(dāng)前為第幾頁
@TotalPage int output, --返回條數(shù)
@OrderType bit -- 設(shè)置排序類型,1 升序 0 值則降序
as
begin
declare @strOrder varchar(400) -- 排序類型
Begin Tran --開始事務(wù)
Declare @sql nvarchar(4000);
Declare @totalRecord int;
--計(jì)算總記錄數(shù)
if (@SqlWhere ='''' or @SqlWhere='' or @sqlWhere is NULL)
set @sql = 'select @totalRecord = count(*) from ' + @TableName
else
set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' where ' + @sqlWhere
EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--計(jì)算總記錄數(shù)
--計(jì)算總頁數(shù)
select @TotalPage=@totalRecord --CEILING((@totalRecord+0.0)/@PageSize)
if @OrderType = 0
begin
set @strOrder = ' order by [' + @OrderField +'] desc'
--如果@OrderType是0,就執(zhí)行降序,這句很重要!
end
else
begin
set @strOrder = ' order by [' + @OrderField +'] asc'
end
if (@SqlWhere ='''' or @SqlWhere='' or @sqlWhere is NULL)
set @sql = 'Select * FROM (select ROW_NUMBER() Over( '+@strOrder+' ) as rowId,' + @Fields + ' from ' + @TableName
else
set @sql = 'Select * FROM (select ROW_NUMBER() Over( '+@strOrder+' ) as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere
--處理頁數(shù)超出范圍情況
if @PageIndex<=0
Set @pageIndex = 1
if @pageIndex>@TotalPage
Set @pageIndex = @TotalPage
--處理開始點(diǎn)和結(jié)束點(diǎn)
Declare @StartRecord int
Declare @EndRecord int
set @StartRecord = (@pageIndex-1)*@PageSize + 1
set @EndRecord = @StartRecord + @pageSize - 1
if @OrderType = 0
begin
set @strOrder = ' order by rowid desc'
--如果@OrderType是0,就執(zhí)行降序,這句很重要!
end
else
begin
set @strOrder = ' order by rowid asc'
end
--繼續(xù)合成sql語句
set @Sql = @Sql + ') as ' + @TableName + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' + Convert(varchar(50),@EndRecord) + ' '+@strOrder
-- print @sql
Exec(@Sql)
---------------------------------------------------
If @@Error <> 0
Begin
RollBack Tran
Return -1
End
Else
Begin
Commit Tran
Return @totalRecord ---返回記錄總數(shù)
End
end
通過上面這些東西的學(xué)習(xí)。我想一定可以找到一種滿意的答案。。。
1.分頁方案一:(利用Not In和SELECT TOP分頁)
語句形式:
復(fù)制代碼 代碼如下:
SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 20 id
FROM TestTable
ORDER BY id))
ORDER BY ID
SELECT TOP 頁大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 頁大小*頁數(shù) id
FROM 表
ORDER BY id))
ORDER BY ID
2.分頁方案二:(利用ID大于多少和SELECT TOP分頁)
語句形式:
復(fù)制代碼 代碼如下:
SELECT TOP 10 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 20 id
FROM TestTable
ORDER BY id) AS T))
ORDER BY ID
SELECT TOP 頁大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 頁大小*頁數(shù) id
FROM 表
ORDER BY id) AS T))
ORDER BY ID
3.分頁方案三:(利用SQL的游標(biāo)存儲(chǔ)過程分頁)
復(fù)制代碼 代碼如下:
create procedure SqlPager
@sqlstr nvarchar(4000), --查詢字符串
@currentpage int, --第N頁
@pagesize int --每頁行數(shù)
as
set nocount on
declare @P1 int, --P1是游標(biāo)的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 總頁數(shù)--,@rowcount as 總行數(shù),@currentpage as 當(dāng)前頁
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off
4.
復(fù)制代碼 代碼如下:
CREATE Procedure FramWorkPage
@TableName varchar(50), --表名
@Fields varchar(5000) = '*', --字段名(全部字段為*)
@OrderField varchar(5000), --排序字段(必須!支持多字段)
@sqlWhere varchar(5000) = Null,--條件語句(不用加where)
@pageSize int, --每頁多少條記錄
@pageIndex int = 1 , --指定當(dāng)前為第幾頁
@TotalPage int output, --返回條數(shù)
@OrderType bit -- 設(shè)置排序類型,1 升序 0 值則降序
as
begin
declare @strOrder varchar(400) -- 排序類型
Begin Tran --開始事務(wù)
Declare @sql nvarchar(4000);
Declare @totalRecord int;
--計(jì)算總記錄數(shù)
if (@SqlWhere ='''' or @SqlWhere='' or @sqlWhere is NULL)
set @sql = 'select @totalRecord = count(*) from ' + @TableName
else
set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' where ' + @sqlWhere
EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--計(jì)算總記錄數(shù)
--計(jì)算總頁數(shù)
select @TotalPage=@totalRecord --CEILING((@totalRecord+0.0)/@PageSize)
if @OrderType = 0
begin
set @strOrder = ' order by [' + @OrderField +'] desc'
--如果@OrderType是0,就執(zhí)行降序,這句很重要!
end
else
begin
set @strOrder = ' order by [' + @OrderField +'] asc'
end
if (@SqlWhere ='''' or @SqlWhere='' or @sqlWhere is NULL)
set @sql = 'Select * FROM (select ROW_NUMBER() Over( '+@strOrder+' ) as rowId,' + @Fields + ' from ' + @TableName
else
set @sql = 'Select * FROM (select ROW_NUMBER() Over( '+@strOrder+' ) as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere
--處理頁數(shù)超出范圍情況
if @PageIndex<=0
Set @pageIndex = 1
if @pageIndex>@TotalPage
Set @pageIndex = @TotalPage
--處理開始點(diǎn)和結(jié)束點(diǎn)
Declare @StartRecord int
Declare @EndRecord int
set @StartRecord = (@pageIndex-1)*@PageSize + 1
set @EndRecord = @StartRecord + @pageSize - 1
if @OrderType = 0
begin
set @strOrder = ' order by rowid desc'
--如果@OrderType是0,就執(zhí)行降序,這句很重要!
end
else
begin
set @strOrder = ' order by rowid asc'
end
--繼續(xù)合成sql語句
set @Sql = @Sql + ') as ' + @TableName + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' + Convert(varchar(50),@EndRecord) + ' '+@strOrder
-- print @sql
Exec(@Sql)
---------------------------------------------------
If @@Error <> 0
Begin
RollBack Tran
Return -1
End
Else
Begin
Commit Tran
Return @totalRecord ---返回記錄總數(shù)
End
end
通過上面這些東西的學(xué)習(xí)。我想一定可以找到一種滿意的答案。。。
您可能感興趣的文章:
- C#調(diào)用SQL?Server中有參數(shù)的存儲(chǔ)過程
- SQL Server存儲(chǔ)過程在C#中調(diào)用的簡(jiǎn)單實(shí)現(xiàn)方法
- C# Ado.net實(shí)現(xiàn)讀取SQLServer數(shù)據(jù)庫存儲(chǔ)過程列表及參數(shù)信息示例
- C#執(zhí)行存儲(chǔ)過程并將結(jié)果填充到GridView的方法
- 使用C#代碼獲取存儲(chǔ)過程返回值
- c#獲取存儲(chǔ)過程返回值示例分享
- C#獲取存儲(chǔ)過程返回值和輸出參數(shù)值的方法
- C#中如何執(zhí)行存儲(chǔ)過程方法
- C#開發(fā)Winform程序調(diào)用存儲(chǔ)過程
相關(guān)文章
.net中string類型可以作為lock的鎖對(duì)象嗎
lock 關(guān)鍵字是用于在多線程編程中實(shí)現(xiàn)同步和互斥訪問的關(guān)鍵字,它的作用是確保共享資源在任意時(shí)刻只能被一個(gè)線程訪問,從而避免出現(xiàn)競(jìng)態(tài)條件(race condition)和數(shù)據(jù)不一致的問題,這篇文章主要介紹了string類型可以作為lock的鎖對(duì)象嗎,需要的朋友可以參考下2023-06-06
.NET之生成數(shù)據(jù)庫全流程實(shí)現(xiàn)
這篇文章主要介紹了.NET之生成數(shù)據(jù)庫全流程實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
三層+存儲(chǔ)過程實(shí)現(xiàn)分頁示例代碼
本文為大家介紹下三層+存儲(chǔ)過程分頁的具體實(shí)現(xiàn),前后臺(tái)及存儲(chǔ)過程代碼如下,感興趣的朋友可以參考下哈2013-06-06
asp.net內(nèi)置對(duì)象 Response對(duì)象使用介紹
這篇文章主要介紹了asp.net內(nèi)置對(duì)象:Response對(duì)象使用介紹,對(duì)Response對(duì)象感興趣的小伙伴們可以參考一下2015-11-11
Asp.net下用JQuery找出哪一個(gè)元素引起PostBack
在Asp.net webform中,如何找出哪一個(gè)按鈕觸發(fā)Button PostBack事件。2010-06-06
HttpRequest的QueryString屬性 的一點(diǎn)認(rèn)識(shí)
我們開發(fā)asp.net程序獲取QueryString時(shí),經(jīng)常性的遇到一些url編碼問題2012-11-11
SqlCommandBuilder如何實(shí)現(xiàn)批量更新
這篇文章主要介紹了SqlCommandBuilder如何實(shí)現(xiàn)批量更新,需要的朋友可以參考下2015-10-10
asp.net request.PathInfo實(shí)現(xiàn)的url重寫
最近對(duì)在開始研究url重寫,對(duì)重寫的原理以及重寫之后引起的性能問題是研究的重點(diǎn),研究過程中發(fā)現(xiàn)了一種輕便的“url重寫方案”2009-04-04

