示例一
createprocedure
commonpagination
@columns
varchar(500), --
要顯示的列名,用逗號隔開
@tablename
varchar(100), --
要查詢的表名
@ordercolumnname
varchar(100), --
排序的列名
@order
varchar(50), --
排序的方式,公升序為asc,降序為 desc
@where
varchar(100), --
where 條件,如果不帶查詢條件,請用 1=1
@pageindex
int, --
當前頁索引
@pagesize
int, --
頁大小(每頁顯示的記錄條數)
@pagecount
int--
總頁數,輸出引數
asbegin
declare
@sqlrecordcount
nvarchar(1000) --
得到總記錄條數的語句
declare
@sqlselect
nvarchar(1000) --
查詢語句
set@sqlrecordcount
=n'select @recordcount=count(*) from '+
@tablename+'
where '+
@where
declare
@recordcount
int--
儲存總記錄條數的變數
exec sp_executesql @sqlrecordcount,n'
@recordcount int output
',@recordcount
output
--動態 sql 傳參
if( @recordcount
%@pagesize
=0) --
如果總記錄條數可以被頁大小整除
set@pagecount
=@recordcount
/@pagesize
--總頁數就等於總記錄條數除以頁大小
else
--如果總記錄條數不能被頁大小整除
set@pagecount
=@recordcount
/@pagesize+1
--總頁數就等於總記錄條數除以頁大小加1
set@sqlselect=n
'select '+
@columns+'
from (
select row_number() over (order by '+
@ordercolumnname+'
'+@order+'
) as tempid,* from '+
@tablename+'
where '+
@where+'
) as temptablename where tempid between '+
str((@pageindex
-1)*
@pagesize+1
) +'
and '+
str( @pageindex
*@pagesize
)
exec (@sqlselect) --
執行動態sql
end--
以下是呼叫示例
declare
@pagecount
intexec
commonpagination
'job_id,job_desc
','jobs
','job_id',
'asc
','1=1
',2,2,@pagecount
output
select
'總頁數為:'+
str(@pagecount)
示例二
createprocedure
commonpagination
(@tablename
varchar(2000), --
表名@refieldsstr
varchar(1000) ='*
', --
欄位名(全部欄位為*)
@orderstring
varchar(200), --
排序字段(必須!支援多欄位不用加order by)
@wherestring
varchar(500) = n'', --
條件語句(不用加where)
@pagesize
int, --
每頁多少條記錄
@pageindex
int=
1, --
指定當前為第幾頁
@totalrecord
int output --
返回總記錄數)as
begin
--處理開始點和結束點
declare
@startrecord
int;
declare
@endrecord
int;
declare
@totalcountsql
nvarchar(500
);
declare
@sqlstring
nvarchar(2000
);
set@startrecord
= (@pageindex
-1) *
@pagesize+1
;
set@endrecord
=@startrecord
+@pagesize-1
;
set@totalcountsql
= n'
select @totalrecord = count(*) from '+
@tablename;--
總記錄數語句
set@sqlstring
= n'
(select row_number() over (order by '+
@orderstring+'
) as rowid,'+
@refieldsstr+'
from '+
@tablename;--
查詢語句
--判斷條件是否為空
if(@wherestring
!=''
or@wherestring
!=null
)
begin
set@totalcountsql
=@totalcountsql+'
where '+
@wherestring
;
set@sqlstring
=@sqlstring+'
where '+
@wherestring
;
end;
--返回總記錄數
exec
sp_executesql
@totalcountsql
, n
'@totalrecord int out',
@totalrecord
output;
----執行主語句
set@sqlstring='
select * from '+
@sqlstring+'
) as t where rowid between '+
ltrim(str(@startrecord))+
'and '+
ltrim(str(@endrecord
));
exec (@sqlstring
);
end;
關於between and 可使用 rowid >= startrecord and rowid <= endrecord 代替,效率更高。
網上很多關於top分頁的例子,不推薦使用top
sql server中top子句可能導致的問題以及解決辦法
通用分頁儲存過程 sqlserver
獲取指定頁的資料 create procedure sppagination tblname varchar 255 表名 strgetfields varchar 1000 需要返回的列 fldname varchar 255 排序的欄位名 pagesize int 10,頁尺寸 pageinde...
通用分頁儲存過程 sqlserver
獲取指定頁的資料 create procedure sppagination tblname varchar 255 表名 strgetfields varchar 1000 需要返回的列 fldname varchar 255 排序的欄位名 pagesize int 10,頁尺寸 pageinde...
SQL Server 通用分頁儲存過程
create proc proc selectforpager tb name varchar max 表名 order varchar 4000 排序字段 offset int 跳過記錄數 field varchar 400 查詢字段 limit int,每頁顯示記錄數 strwhere nvar...