CTE通用表示式分頁

2021-06-11 21:24:46 字數 3306 閱讀 5186

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可以看組是乙個臨時的...