从通用分页存储过程[ROWCOUNT方式]抽出适合自己需求的分页过程
生活随笔
收集整理的這篇文章主要介紹了
从通用分页存储过程[ROWCOUNT方式]抽出适合自己需求的分页过程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
通用分頁存儲過程很實用,但畢竟不是全適用于一些環境,譬如我遇到過一種情況,需要先外鏈兩個表,然后再關聯幾個表,總之參數傳遞很煩人,這里不細說了,現在只談實現查詢后,怎么分頁的簡單技巧
1,建立用戶函數
CREATE?? function?? F_xxxx(@ID? nvarchar(36),@Key nvarchar(36),......)
{
......//這里查詢出你需要分頁的所有數據,可以帶參數來查詢
}
建函數的目的是為了整合查詢的數據,主要是可以帶入參數,很方便.
注,函數中沒有exec語句,不可以拼接SQL,不過可以調用存儲過程.
2,建分頁存儲過程,具體框架和說明如下
/**//*080520??by?zjyaoo@live.cn*/??
CREATE?PROCEDURE?dbo.SPCustomPaging
????(
????@PageSize?int?=15,?--頁面大小
????@PageNumber?int?=1,?--頁碼
????@傳入到函數的參數1?nvarchar(36),?--傳入到函數的參數,這里參數個數根據建的函數來決定
????@傳入到函數的參數2?nvarchar(36),?--傳入到函數的參數,這里參數個數根據建的函數來決定
????@StrWhere?nvarchar(2000)='?AND?1=1'?,?--條件,注:傳入的@StrWhere需要replace.(''','''')處理
????@RecordCount?int?=0??output??--返回總的條數
????)
AS
DECLARE?@strStartRow?int
IF?@PageNumber?<?1
????SET?@PageNumber?=?1
SET?@strStartRow?=(@PageNumber?-?1)*?@PageSize?+?1??--設置其實頁碼
----
DECLARE?@str_Count_SQL?nvarchar(500)?
SET?@str_Count_SQL=?'SELECT?@TotalCount=count(*)?FROM??[F_建立的的函數]('''+@函數參數1+''','''+@函數參數2+''')?Where?1=1?'??+?@StrWhere??--1=1,用于外接條件
EXEC?sp_executesql?@str_Count_SQL,N'@TotalCount?int=0?output',@RecordCount?output??--獲取總的條數
Declare?@Sql?nvarchar(1000)
set?@Sql?=
'DECLARE??@SortColumn??nvarchar(255)??--建幾個臨時變量
DECLARE??@SortNullValue??nvarchar(255)?
DECLARE??@PKStartValue??nvarchar(255)??
SET?@SortNullValue?=?CAST(''''?as?int)
SET?ROWCOUNT??'+??cast(@strStartRow???as??nvarchar(5))??+'???--整數轉為字符
SELECT?@SortColumn=?isNull([函數中的分類字段]?,@SortNullValue),?@PKStartValue?=?[函數中的關鍵字段]????FROM???[F_建立的的函數]('''+@函數參數1+''','''+@函數參數2+''')???Where?1=1???'+@StrWhere?+'??ORDER?BY?[函數中的分類字段],?[再加個函數中的關鍵字段]?Desc?
SET?ROWCOUNT???'+?cast(@PageSize???as??nvarchar(5))?+'????--整數轉為字符
SELECT?*?FROM??F_ManufacturerDiscount('''+@OrgID+''')?
?WHERE??(isNull([函數中的分類字段],@SortNullValue)>@SortColumn?or?(isNull([函數中的分類字段],@SortNullValue)=@SortColumn?and?[函數中的關鍵字段]<=@PKStartValue))??'+@StrWhere?+'??ORDER?BY?[函數中的分類字段],[函數中的關鍵字段]?Desc
RETURN'
Exec?(@Sql)
GO
1,建立用戶函數
CREATE?? function?? F_xxxx(@ID? nvarchar(36),@Key nvarchar(36),......)
{
......//這里查詢出你需要分頁的所有數據,可以帶參數來查詢
}
建函數的目的是為了整合查詢的數據,主要是可以帶入參數,很方便.
注,函數中沒有exec語句,不可以拼接SQL,不過可以調用存儲過程.
2,建分頁存儲過程,具體框架和說明如下
/**//*080520??by?zjyaoo@live.cn*/??
CREATE?PROCEDURE?dbo.SPCustomPaging
????(
????@PageSize?int?=15,?--頁面大小
????@PageNumber?int?=1,?--頁碼
????@傳入到函數的參數1?nvarchar(36),?--傳入到函數的參數,這里參數個數根據建的函數來決定
????@傳入到函數的參數2?nvarchar(36),?--傳入到函數的參數,這里參數個數根據建的函數來決定
????@StrWhere?nvarchar(2000)='?AND?1=1'?,?--條件,注:傳入的@StrWhere需要replace.(''','''')處理
????@RecordCount?int?=0??output??--返回總的條數
????)
AS
DECLARE?@strStartRow?int
IF?@PageNumber?<?1
????SET?@PageNumber?=?1
SET?@strStartRow?=(@PageNumber?-?1)*?@PageSize?+?1??--設置其實頁碼
----
DECLARE?@str_Count_SQL?nvarchar(500)?
SET?@str_Count_SQL=?'SELECT?@TotalCount=count(*)?FROM??[F_建立的的函數]('''+@函數參數1+''','''+@函數參數2+''')?Where?1=1?'??+?@StrWhere??--1=1,用于外接條件
EXEC?sp_executesql?@str_Count_SQL,N'@TotalCount?int=0?output',@RecordCount?output??--獲取總的條數
Declare?@Sql?nvarchar(1000)
set?@Sql?=
'DECLARE??@SortColumn??nvarchar(255)??--建幾個臨時變量
DECLARE??@SortNullValue??nvarchar(255)?
DECLARE??@PKStartValue??nvarchar(255)??
SET?@SortNullValue?=?CAST(''''?as?int)
SET?ROWCOUNT??'+??cast(@strStartRow???as??nvarchar(5))??+'???--整數轉為字符
SELECT?@SortColumn=?isNull([函數中的分類字段]?,@SortNullValue),?@PKStartValue?=?[函數中的關鍵字段]????FROM???[F_建立的的函數]('''+@函數參數1+''','''+@函數參數2+''')???Where?1=1???'+@StrWhere?+'??ORDER?BY?[函數中的分類字段],?[再加個函數中的關鍵字段]?Desc?
SET?ROWCOUNT???'+?cast(@PageSize???as??nvarchar(5))?+'????--整數轉為字符
SELECT?*?FROM??F_ManufacturerDiscount('''+@OrgID+''')?
?WHERE??(isNull([函數中的分類字段],@SortNullValue)>@SortColumn?or?(isNull([函數中的分類字段],@SortNullValue)=@SortColumn?and?[函數中的關鍵字段]<=@PKStartValue))??'+@StrWhere?+'??ORDER?BY?[函數中的分類字段],[函數中的關鍵字段]?Desc
RETURN'
Exec?(@Sql)
GO
轉載于:https://www.cnblogs.com/zjy/archive/2008/05/20/1203589.html
總結
以上是生活随笔為你收集整理的从通用分页存储过程[ROWCOUNT方式]抽出适合自己需求的分页过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++学习——C++中的四个智能指针
- 下一篇: Microsoft OLE DB Pro