首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

[分享加散分]sql server 2005分页存储过程和sql server 2000分页存储过程,该如何处理

2012-02-22 
[分享加散分]sql server 2005分页存储过程和sql server 2000分页存储过程sql server 2005分页存储过程和sq

[分享加散分]sql server 2005分页存储过程和sql server 2000分页存储过程
sql server 2005分页存储过程和sql server 2000分页存储过程,sql 2005的分页存储过程分3个版本,一个是没有优化过的,一个是优化过的,最后一个支持jion的,sql2000的分页存储过程,也可以运行在sql2005上,但是性能没有sql2005的版本好。
sql 2005:

SQL code
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 ---返回记录总数      End    end

sql 2005:
SQL code
/****** 对象:  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 ---返回记录总数      End   ENDGO 



[解决办法]
學習~~~
[解决办法]
向楼主学习...
[解决办法]
探讨
向楼主学习...

[解决办法]
up学习
[解决办法]
偶一直认为用set rowcount 比row_number()效率高
[解决办法]
、、
[解决办法]
set @tsql=N'select @RecordCount = count(*) from ' + @QueryStr + ' where ' + @WhereStr

完全可以把' where '放入@WhereStr之中。
同样,还有order by等等。

当然,这是个人习惯问题,众口难调……
[解决办法]
sql 2005的前两个分页存储过程哪里有优化,看不出来啊
[解决办法]
楼主 知识水平不错啊!!!
不做评价 
接分!!!

[解决办法]
向楼主学习
[解决办法]
.
[解决办法]
收藏
[解决办法]
收藏
[解决办法]
完全看不懂。。。JF才是王道
[解决办法]
收藏
[解决办法]
虽然看了晕忽忽的,恩,学习下~~~顺便接分,哈哈
[解决办法]
学习
[解决办法]
帖子内容不能为空,请输入帖子内容
[解决办法]
努力学习。。。
[解决办法]
看看加接分
[解决办法]
要向楼主学习哦,收藏了。
[解决办法]
学习,学习!!



[解决办法]
以前也弄的有,不过还是收藏了先.
对周公仰慕中!
[解决办法]
up
[解决办法]
接分,学习
[解决办法]
听说今天是周公阳历生日,Happy birthday!
学习...
[解决办法]
jf,mark

热点排行