sqlserver 通用分頁儲存過程

2021-09-07 03:27:48 字數 4320 閱讀 6622

示例一

create

procedure

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)

示例二

create

procedure

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...