create procedure [dbo].[spc_pagination]
@sztablename nvarchar(4000),
@szfield nvarchar(4000),
@szwhere nvarchar(4000),
@szorder nvarchar(4000),
@pagesize int,
@pageindex int
asdeclare @szsql nvarchar(4000)
--set @pagesize = 3
--set @pageindex = 3
--set @sztablename = 'person'
--set @szfield = 'firstname, age, age2, gender'
--set @szorder = 'age, age2 desc'
--set @szwhere = 'age > 6'
set @szsql = ''
set @szsql = @szsql + 'declare @total_pages as int;' + char(13)
set @szsql = @szsql + 'declare @current_page as int;' + char(13)
set @szsql = @szsql + 'declare @page_size as int;' + char(13)
set @szsql = @szsql + 'declare @start_row_num as int;' + char(13)
set @szsql = @szsql + 'declare @end_row_num as int;' + char(13)
set @szsql = @szsql + 'declare @total_rows as float;' + char(13)
set @szsql = @szsql + 'set @page_size = ' + cast(@pagesize as nvarchar) + ';' + char(13)
set @szsql = @szsql + 'set @current_page = ' + cast(@pageindex as nvarchar) + ';' + char(13)
-- 計算總頁數
set @szsql = @szsql + 'select @total_rows = count(*) from ' + @sztablename
if len(@szwhere) > 0
begin
set @szsql = @szsql + char(13) + 'where ' + @szwhere
endset @szsql = @szsql + ';' + char(13)
set @szsql = @szsql + 'set @total_pages = ceiling(@total_rows / @page_size);' + char(13)
set @szsql = @szsql + 'if @current_page > @total_pages' + char(13)
set @szsql = @szsql + ' set @current_page = @total_pages;' + char(13)
-- 列出指定頁的內容
set @szsql = @szsql + 'if @current_page = 1' + char(13)
set @szsql = @szsql + 'begin' + char(13)
set @szsql = @szsql + ' select top ' + cast(@pagesize as nvarchar) + ' ' + @szfield + char(13)
set @szsql = @szsql + ' from ' + @sztablename + char(13)
if len(@szwhere) > 0
begin
set @szsql = @szsql + ' where ' + @szwhere + char(13)
endset @szsql = @szsql + ' order by ' + @szorder + char(13)
set @szsql = @szsql + 'end' + char(13)
set @szsql = @szsql + 'else' + char(13)
set @szsql = @szsql + 'begin' + char(13)
set @szsql = @szsql + ' set @start_row_num = (@current_page - 1) * @page_size + 1;' + char(13)
set @szsql = @szsql + ' set @end_row_num = @start_row_num + @page_size - 1;' + char(13)
set @szsql = @szsql + ' with t as' + char(13)
set @szsql = @szsql + ' (' + char(13)
set @szsql = @szsql + ' select ' + @szfield + ', row_number(' + + ') over(order by ' + @szorder + ') as row_number ' + char(13)
set @szsql = @szsql + ' from ' + @sztablename + char(13)
if len(@szwhere) > 0
begin
set @szsql = @szsql + ' where ' + @szwhere + char(13)
endset @szsql = @szsql + ' )' + char(13)
set @szsql = @szsql + ' select * from t' + char(13)
set @szsql = @szsql + ' where row_number between @start_row_num and @end_row_num' + char(13)
set @szsql = @szsql + 'end' + char(13)
set @szsql = @szsql + 'select @current_page as pageno, @total_pages as totalpages, cast(@total_rows as int) as totalrows;'
--print @szsql
exec(@szsql)
go
公用表表示式CTE
公用表表示式cte表面上和派生表非常相似,看起來只是語義上的區別。但和派生表比較起來,cte具有幾個優勢 第一,如果須要在乙個cte中引用另乙個cte,不需要像派生表那樣巢狀,相反,只要簡單地在同乙個with子句中定義多個cte,並用逗號把它們分隔開。每個cte可以引用在它前面定義的所有cte。而外...
公用表表示式 CTE
在編寫t sql 時,往往需要臨時儲存某些結果集。前面我們已經廣泛使用和介紹了兩種臨時儲存結果集的方法 臨時表和表變數。除此之外,還可以使用公用表表示式的方法。公用表表示式 common table expression 是sql server2005版本的引入的乙個特性。cte可以看組是乙個臨時的...
公用表表示式 CTE
在編寫t sql 時,往往需要臨時儲存某些結果集。前面我們已經廣泛使用和介紹了兩種臨時儲存結果集的方法 臨時表和表變數。除此之外,還可以使用公用表表示式的方法。公用表表示式 common table expression 是sql server2005版本的引入的乙個特性。cte可以看組是乙個臨時的...