SqlServer 2000、2005分頁預存程序整理第1/3頁_MsSql

來源:互聯網
上載者:User

sql server 2005的分頁預存程序分3個版本,一個是沒有最佳化過的,一個是最佳化過的,最後一個支援join的,sql server 2000的分頁預存程序,也可以運行在sql server 2005上,但是效能沒有sql server 2005的版本好。

在最後 我還附帶了一個二分法的分頁預存程序,也很好用的說哈~~

1.SqlServer 2005:

SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE proc [dbo].[up_Page2005] @TableName varchar(50),    --表名 @Fields varchar(5000) = '*',  --欄位名(全部欄位為*) @OrderField varchar(5000),    --排序欄位(必須!支援多欄位) @sqlWhere varchar(5000) = Null,--條件陳述式(不用加where) @pageSize int,          --每頁多少條記錄 @pageIndex int = 1 ,      --指定當前為第幾頁 @TotalPage int output      --返回總頁數asbegin  Begin Tran --開始事務  Declare @sql nvarchar(4000);  Declare @totalRecord int;  --計算總記錄數  if (@SqlWhere='' or @sqlWhere=NULL)    set @sql = 'select @totalRecord = count(*) from ' + @TableName  else    set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' with(nolock) where ' + @sqlWhere  EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--計算總記錄數  --計算總頁數  select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)  if (@SqlWhere='' or @sqlWhere=NULL)    set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName  else    set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' with(nolock) where ' + @SqlWhere  --處理頁數超出範圍情況  if @PageIndex<=0    Set @pageIndex = 1  if @pageIndex>@TotalPage    Set @pageIndex = @TotalPage   --處理開始點和結束點  Declare @StartRecord int  Declare @EndRecord int  set @StartRecord = (@pageIndex-1)*@PageSize + 1  set @EndRecord = @StartRecord + @pageSize - 1  --繼續合成sql語句  set @Sql = @Sql + ') as t where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' + Convert(varchar(50),@EndRecord)   print @sql  Exec(@Sql)  ---------------------------------------------------  If @@Error <> 0   Begin    RollBack Tran    Return -1   End   Else   Begin    Commit Tran    Return @totalRecord ---返回記錄總數   Endend

2.Sql Server 2005:

/****** 對象: StoredProcedure [dbo].[up_Page2005V2]  指令碼日期: 05/21/2008 11:27:15 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:    <Author,,Name>-- Create date: <Create Date,,>-- Description:  <Description,,>-- =============================================CREATE PROCEDURE [dbo].[up_Page2005V2]  @TableName varchar(50),    --表名 @Fields varchar(5000) = '*',  --欄位名(全部欄位為*) @OrderField varchar(5000),    --排序欄位(必須!支援多欄位) @sqlWhere varchar(5000) = Null,--條件陳述式(不用加where) @pageSize int,          --每頁多少條記錄 @pageIndex int = 1 ,      --指定當前為第幾頁 @totalRecord int = 0, @TotalPage int output      --返回總頁數ASBEGIN   Begin Tran --開始事務  Declare @sql nvarchar(4000);  if @totalRecord<=0 begin    --計算總記錄數    if (@SqlWhere='' or @sqlWhere=NULL)      set @sql = 'select @totalRecord = count(*) from ' + @TableName    else      set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' with(nolock) where ' + @sqlWhere    EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--計算總記錄數  end  --計算總頁數  select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)  if (@SqlWhere='' or @sqlWhere=NULL)    set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName  else    set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' with(nolock) where ' + @SqlWhere  --處理頁數超出範圍情況  if @PageIndex<=0    Set @pageIndex = 1  if @pageIndex>@TotalPage    Set @pageIndex = @TotalPage   --處理開始點和結束點  Declare @StartRecord int  Declare @EndRecord int  set @StartRecord = (@pageIndex-1)*@PageSize + 1  set @EndRecord = @StartRecord + @pageSize - 1  --繼續合成sql語句  set @Sql = @Sql + ') as t where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' + Convert(varchar(50),@EndRecord)   print @sql  Exec(@Sql)  ---------------------------------------------------  If @@Error <> 0   Begin    RollBack Tran    Return -1   End   Else   Begin    Commit Tran    Return @totalRecord ---返回記錄總數   EndENDGO

3.Sql Server 2005:

/****** 對象: StoredProcedure [dbo].[up_Page2005V2_Join]  指令碼日期: 05/21/2008 11:27:30 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [dbo].[up_Page2005V2_Join]  @TableName varchar(150),    --表名 @Fields varchar(5000) = '*',  --欄位名(全部欄位為*) @OrderField varchar(5000),    --排序欄位(必須!支援多欄位) @sqlWhere varchar(5000) = Null,--條件陳述式(不用加where) @pageSize int,          --每頁多少條記錄 @pageIndex int = 1 ,      --指定當前為第幾頁 @totalRecord int = 0, @TotalPage int output      --返回總頁數ASBEGIN   Begin Tran --開始事務  Declare @sql nvarchar(4000);  if @totalRecord<=0 begin    --計算總記錄數    if (@SqlWhere='' or @sqlWhere=NULL)      set @sql = 'select @totalRecord = count(*) from ' + @TableName    else      set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' where ' + @sqlWhere    EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--計算總記錄數  end  --計算總頁數  select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)  if (@SqlWhere='' or @sqlWhere=NULL)    set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName  else    set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere  --處理頁數超出範圍情況  if @PageIndex<=0    Set @pageIndex = 1  if @pageIndex>@TotalPage    Set @pageIndex = @TotalPage   --處理開始點和結束點  Declare @StartRecord int  Declare @EndRecord int  set @StartRecord = (@pageIndex-1)*@PageSize + 1  set @EndRecord = @StartRecord + @pageSize - 1  --繼續合成sql語句  set @Sql = @Sql + ') as t where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' + Convert(varchar(50),@EndRecord)   print @sql  Exec(@Sql)  ---------------------------------------------------  If @@Error <> 0   Begin    RollBack Tran    Return -1   End   Else   Begin    Commit Tran    Return @totalRecord ---返回記錄總數   EndEND

4.Sql Server 2000:

USE [game]GO/****** 對象: StoredProcedure [dbo].
  
當前1/3頁  123下一頁閱讀全文

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.