首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

分页存储过程有一个有关问题 , 不知道怎么解决?

2012-03-14 
分页存储过程有一个问题 , 不知道如何解决??调用分页存储过程 ,查询语句是按照时间排序的,但是由于有好多

分页存储过程有一个问题 , 不知道如何解决??
调用分页存储过程 ,查询语句是按照时间排序的,但是由于有好多时间是一样的,
所以当我翻到其他页的时候,有好多数据都显示不出来,怎么避免呢???


[解决办法]
你是用的一个通用的分页存储过程吧,那个存储过程对复杂的查询支持不好,排序也只能有一个字段,如果你用的是SQL 2005的数据库,可以选用一些较新的通用存储过程
[解决办法]
下面是我在用的一个,也是根据网上的做了一点修改吧
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[up_Page2005V2_Join]
@TableNamenvarchar(200),-- 表名
@ReturnFieldsnvarchar(2000) = '*',-- 需要返回的列 
@PageSizeint = 10,-- 每页记录数
@PageIndexint = 1,-- 当前页码
@Wherenvarchar(2000) = '',-- 查询条件
@Orderfldnvarchar(2000)='',-- 排序字段名 最好为唯一主键
@OrderTypeint = 1-- 排序类型 1:降序 其它为升序
 
AS
BEGIN

Begin Tran --开始事务
Declare @TotalRecord int
Declare @TotalPage int
Declare @sql nvarchar(4000); 


--计算总记录数

if (@Where='' or @Where=NULL)
set @sql = 'select @TotalRecord = count(*) from ' + @TableName
else
set @sql = 'select @TotalRecord = count(*) from ' + @TableName + ' where ' + @Where

EXEC sp_executesql @sql,N'@TotalRecord int OUTPUT',@TotalRecord OUTPUT--计算总记录数


--计算总页数
select @TotalPage=CEILING((@TotalRecord+0.0)/@PageSize)

if (@Where='' or @Where=NULL)
set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @Orderfld + ') as rowId,' + @ReturnFields + ' from ' + @TableName 
else
set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @Orderfld + ') as rowId,' + @ReturnFields + ' from ' + @TableName + ' where ' + @Where


--处理页数超出范围情况
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)

SELECT @TotalRecord as RecordCount,@TotalPage as PageCount
---------------------------------------------------
If @@Error <> 0
Begin
RollBack Tran
Return -1
End
Else
Begin
Commit Tran
Return @TotalRecord ---返回记录总数
End
END

[解决办法]
http://www.cnblogs.com/rainsure/archive/2008/09/20/1294574.html

up
[解决办法]
自己做了一点修改,只是为了兼容原来的那个存储过程,其实有些参数没有必要,这么改只是不想对程序做更多改动
[解决办法]
order by _date desc, _id desc

[解决办法]

SQL code
CREATE PROCEDURE sp_EC_get_Store    --@id int,    @pagesize int,   --每页条数    @pageindex int,  --页数    @docount bit,  --是否进行统计    @condition varchar(800)  --查询条件     AS    set nocount on    if(@docount=1)        exec('SELECT count(*) FROM EC_Web_StoreInfo a where 1=1 '+@condition)    else    begin        declare @PageLowerBound int        declare @PageUpperBound int        set @PageLowerBound=(@pageindex-1)*@pagesize        set @PageUpperBound=@PageLowerBound+@pagesize        set rowcount @PageUpperBound        set @PageLowerBound=@PageLowerBound+1        exec('declare @indextable table(id int identity(1,1),nid int)            insert into @indextable(nid) select a.id from EC_Web_StoreInfo a where 1=1 '+@condition+' order by a.id desc            SELECT a.id, a.name, a.info, a.notice, a.address, a.CID, a.commend, Convert(varchar(10),a.addDate,120) as addDate,            (select ClientName from web_Clients b where a.cid=b.ClientID) as ClientName,            (select DName from Common_DCode c where c.DCode=a.address) as Area,            substring(a.address,1,2) as areaCode,substring(a.address,3,2) as cityCode,substring(a.address,5,2) as countyCode            FROM EC_Web_StoreInfo a, @indextable t  WHERE 1=1 '+@condition+' and  a.id=t.nid                and t.id between '+@PageLowerBound+' and '+@PageUpperBound+'                    order by t.id ')    endset nocount offGO
[解决办法]
原来普通不行,用sql2005就能解决, 我原来也遇到了这个问题,我网站的产品是按刷新时间排序,如果正常添加没有问题,刷新时间和添加时间是一致的。但是我是允许客户刷新产品的,一刷新,他的产品刷新时间全都相同了。比如他有30个产品,而每页才显示15个,就出现了你那个问题,不能正常分页

即使这样排序order by _date desc, _id desc 也是会出问题。

你换一个sql2005的存储过程
sql2005里面有rownumber可以解决这个问题

热点排行