首页 新闻 搜索 专区 学院

大家来看看我这个分页哪里有错

0
悬赏园豆:100 [已关闭问题] 关闭于 2012-11-16 08:45

我用的是sqlserver2000的数据库

 

数据大概有20万吧……

 

我写的主个分页的查询语句,现在出现一个情况就是,数据少的话,可以正常运行,一旦数据量大就,查询不了了,数据量实在是太大了;

语句如下 :

Select 序号=IDENTITY(int,1,1),* INTO #中间表 From 
[要查询的表] where 1=1 
select * from #中间表 
where 
#中间表.序号 > (@PageIndex-1)*@PageCount and #中间表.序号 <= (@PageIndex-1)*@PageCount + @PageCount

drop table #中间表

 

大伙帮我修改一下……

田麦成的主页 田麦成 | 小虾三级 | 园豆:1984
提问于:2012-11-12 09:34
< >
分享
所有回答(10)
-2
if exists (select * from sysobjects where name='[GetDataList]')
    drop proc [GetDataList]
go
CREATE PROCEDURE [dbo].[GetDataList]
    @TableName varchar(500)='', --表名(多表连接table1,table2然后用where字段处理或者table1 inner join table2 on col1=col2)
    @Fields varchar(5000) = '*', --字段名(全部字段为*)
    @OrderField varchar(5000), --排序字段(必须!支持多字段)
    @sqlWhere varchar(5000) = Null,--条件语句(不用加where)
    @pageSize int, --每页多少条记录
    @pageIndex int = 1 , --指定当前为第几页
    @groupby int=0,
    @TotalPage int output, --返回总页数 
    @totalRecord int output 
as
    begin
    --Begin Tran --开始事务
        Declare @sql nvarchar(4000)
        --计算总记录数

        if (@SqlWhere='' or @sqlWhere=NULL)
            begin
            if(@groupby=1)
                    begin
                        set @Sql = 'select @totalRecord = count(*) from (Select count(*) as ct from ' + @TableName+' group by '+@Fields+') as t'
                    end
            else
                set @sql = 'select @totalRecord = count(*) from ' + @TableName
                
            end
        else
            begin
            if(@groupby=1)
                    begin
                        set @Sql =  'select @totalRecord = count(*) from (select count(*) as ct from ' + @TableName + ' where ' + @sqlWhere+' group by '+@Fields+') as t'
                    end
            else
                set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' where ' + @sqlWhere
                
            end
            print @sql
        EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数 

            --计算总页数
            select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)
        if (@SqlWhere='' or @sqlWhere=NULL)
            begin
                if(@OrderField='' or @OrderField= NULL)
                    begin
                        set @sql = 'Select '+@Fields+' FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName 
                            if(@groupby=1)
                                begin
                                    set @Sql = @Sql+' group by '+@Fields
                                end
                    end
                else
                    begin
                        set @sql = 'Select '+@Fields+' FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName 
                            if(@groupby=1)
                                begin
                                    set @Sql = @Sql+' group by '+@Fields
                                end
                    end
            end
        else
        begin
            if(@OrderField='' or @OrderField= NULL)
                begin
                    set @sql = 'Select '+@Fields+' FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere 
                    if(@groupby=1)
                        begin
                            set @Sql = @Sql+' group by '+@Fields
                        end
                end
            else
                begin
                    set @sql = 'Select  '+@Fields+' FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere 
                    if(@groupby=1)
                        begin
                            set @Sql = @Sql+' group by '+@Fields
                        end
                end
        end
        --处理页数超出范围情况
        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 ' + @TableName + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' + Convert(varchar(50),@EndRecord)
        
        if(@groupby=1)
            begin
                set @Sql = @Sql+' group by '+@Fields
            end
            if(@OrderField<>'')
                begin
                    set @Sql =  @Sql +' order by '+@OrderField
                end 
        --print(@Sql)
        Exec(@Sql)
        -----------------------------------------------------
        --If @@Error <> 0
        --    Begin
        --        RollBack Tran
        --        Return -1
        --    End
        --else
        --    Begin
        --        Commit Tran
        --        print(@totalRecord)
        --        Return @totalRecord ---返回记录总数
        --    End 
    end
GO

用这个看看

az235 | 园豆:8283 (大侠五级) | 2012-11-12 09:45

大哥……

 

SqlServer2000没有

ROW_NUMBER这个分页函数……
支持(0) 反对(0) 田麦成 | 园豆:1984 (小虾三级) | 2012-11-12 09:53
0

Select 序号=IDENTITY(int,1,1),* INTO #中间表 From [要查询的表] where 1=1

这句看看能不能改进,不要把[要查询的表]中的数据全部查出来


应该给[要查询的表]增加一个自增长字段
田林九村 | 园豆:2367 (老鸟四级) | 2012-11-12 09:47
-2

楼上的可以实现

jason2013 | 园豆:1998 (小虾三级) | 2012-11-12 09:48

敢情你没用过Sqlserver2000

 

SqlServer2000没有

ROW_NUMBER这个分页函数……
支持(1) 反对(0) 田麦成 | 园豆:1984 (小虾三级) | 2012-11-12 09:53

@田麦成: 批评的好,赞一个

支持(0) 反对(0) 田林九村 | 园豆:2367 (老鸟四级) | 2012-11-12 09:59
0

你这个创建临时表的操作太费时间,可以考虑给表增加一个自增字段id,然后再去网上找分页的方法,要不然不可能快。你的目的我大概知道,因为表数据会删除,造成id不连续,但是可以利用top函数等实现,不一定要你这样

飞来飞去 | 园豆:2057 (老鸟四级) | 2012-11-12 10:14
0

给临时表赋值 应该更耗时吧

Qlin | 园豆:2403 (老鸟四级) | 2012-11-12 12:34
0

mark

ms_water | 园豆:510 (小虾三级) | 2012-11-12 13:27
0

楼主的这个临时表做法的确慢,但是2000的sql没有row_number()函数真的很蛋疼,如果能上2005的sql 那就有很多方法分页了

建议楼主去网上找一些成熟的2000 sql下的分页存储过程吧

oppoic | 园豆:560 (小虾三级) | 2012-11-12 13:56
0

简单点使用:select top 10 * from A where ID not in (select top 30 ID from A)

考虑效率的话参考:http://www.cnblogs.com/wenyang-rio/archive/2012/10/25/2738499.html#2514869

jingjunfeng | 园豆:873 (小虾三级) | 2012-11-12 13:59
-1

倾城绝厉 | 园豆:4 (初学一级) | 2012-11-12 17:13
0

不如先改改数据库吧

ERS | 园豆:728 (小虾三级) | 2012-11-13 16:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册