pager procedure for sql server

來源:互聯網
上載者:User
server SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO ALTER procedure dbo.pager ( @page_num int = 1, @item_count int = 0, @query_suffix nvarchar(4000), @query_fields nvarchar(4000) = '*', @query_key nvarchar(4000), @record_count int = null output ) /****************************************************************************** ** 檔案: pager.sql ** 名稱: pager ** ** 參數:@page_num 頁碼,起始頁碼為 1,預設頁碼為 1。 ** @item_count 每頁顯示的記錄條數,預設顯示0條。0條表示取出所有資料。 ** @query_suffix 查詢尾碼,即 from 後的所有語句。 ** @query_fields 需要查詢的欄位, 預設為所有欄位 '*'。 ** @query_key 查詢主鍵 ** @record_count 紀錄總數,當參數為 null 的時候,不執行匯總操作。該參數暫未生效。 ** ** 描述: 分頁器。 ** 取出指定區間的查詢。 ** 使用須知: ** 1 查詢必須顯式指定排序方式。 ** 2 query_key 必須在 query_fields 中出現。 ** 3 query_key 應該是個不允許為空白,且不重複的欄位。 ** 樣本: ** 用該函數取出 ** select a.id, a.name, b.school_name from user a, school b where a.school_id=b.id order by a.id desc ** 第二頁的資料,每頁顯示 10 條紀錄 ** exec pager @page_num = 2, @item_count = 10, @query_suffix='user a, school b where a.school_id=b.id order by a.id desc', @query_fields='a.id, a.name, b.school_name', @query_key='a.id' ** ** 要取出所有紀錄 ** exec pager @query_suffix='user a, school b where a.school_id=b.id order by a.id desc', @query_fields='a.id, a.name, b.school_name', @query_key='a.id' ** ** 建立:whxbb@20030108 ** 修改: ** ** ** 返回:成功 0 失敗錯誤代號. *******************************************************************************/ As -- 查詢語句 declare @query nvarchar(4000) declare @query_start nvarchar(4000) declare @query_end varchar(4000) -- 錯誤號碼 declare @error_code int -- 起始記錄號 declare @begin_no int -- 結束記錄號 declare @end_no int set @query_suffix = ' from ' + @query_suffix if (@item_count = 0) begin set @query = 'select ' + @query_fields + ' ' + @query_suffix end else if (@page_num = 1) begin -- 第一頁,直接使用 top n 取值 set @query = 'select top ' + cast(@item_count as nvarchar(10)) + ' ' + @query_fields + ' ' + @query_suffix end else -- 不是第一頁 begin -- 上頁的最後一個紀錄號 set @begin_no = (@page_num - 1) * @item_count -- 本頁的最後一個紀錄號 set @end_no = @begin_no + @item_count -- 構建分頁查詢語句 set @query_start = 'select top ' + cast(@end_no as nvarchar(10)) + ' ' + @query_fields set @query_start = @query_start + ' from (' + @query_start + ' ' + @query_suffix + ') as query_table where' set @query_end = 'select top ' + cast(@begin_no as nvarchar(10)) + ' ' + @query_key + ' ' + @query_suffix set @query = @query_start + ' ' + @query_key + ' not in(' + @query_end + ')' end print 'Query constructed: ' + @query -- 執行分頁查詢語句 exec(@query) set @error_code = @@error if @error_code <> 0 goto error_handle if (@record_count is not null) begin-- 統計結果總數 -- 建立一個暫存預存程序用於帶出構建查詢語句的結果 set @query = 'create procedure #tmp_procedure_pager_count(@count int output)as select top 100 percent ' + @query_key + ' ' + @query_suffix + ' select @count=@@rowcount' print 'Count query constructed:' + @query exec(@query) set @error_code = @@error if @error_code <> 0 goto error_handle -- 執行暫存預存程序 exec #tmp_procedure_pager_count @record_count output set @error_code = @@error if @error_code <> 0 goto error_handle -- 刪除暫存預存程序 drop procedure #tmp_procedure_pager_count end error_handle: return @error_code return @error_code GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO -- use example execute pager @page_num = 1, @item_count = 3324, @query_suffix=' test where 1=1 order by entity_id', @query_key='entity_id' declare @i int set @i = 0 exec pager @query_suffix=' test where 1=1 order by entity_id', @query_fields='entity_name, entity_short_name, entity_id', @query_key='entity_id', @record_count=@i output select @i

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.