作者lostid (lostid)
看板C_Sharp
标题Re: [问题] 上一页/下一页之SQL探讨?
时间Sat Jun 21 11:15:37 2008
※ 引述《tomex (Tomex Ou)》之铭言:
: ASP.NET网页设计里,
: 原以为观看detail资料的下方有个上一页/下一页很简单
: 发现ASP.NET的Paper都是丢所有资料Datable
: 我嫌这样资料量太大(毕竟只有1笔而己)
: 改用手写下sql方式。
: 以为多下两道大於或小於该key值的sql就好
: 但是考量此上/下页的顺序,
: 是根据前页资料列表的排序规则(可能多栏排序)
: 细想之下,发现真的不简单...
: 因为sql表中的资料并不一定连续。
: 请问该如何在不查询所有资料下
: 得到指定笔项目的上/下笔资料呢?
: 难道最终仍是得把所有资料取出吗?
: 不甘心呀!!
CREATE PROCEDURE sp_Paging
@tblName varchar(255) ,
@strGetFields varchar(1000) = '*',
@fldName varchar(255)='',
@pageSize int = 10,
@pageIndex int = 1,
@recordCount int = 0 output,
@pageCount int = 0 output,
@orderType int = 0,
@strWhere varchar(1500) = ''
AS
declare @strSQL nvarchar(3000)
declare @strTmp varchar(110)
declare @strOrder varchar(400)
begin
if @strWhere !=''
set @strSQL = 'select @recordCount = count(*) from ' + @tblName + ' where '+@strWhere
else
set @strSQL = 'select @recordCount = count(*) from ' + @tblName
end
exec sp_executesql @strSQL,N'@recordCount int out ',@recordCount out
if @recordCount % @pageSize = 0
set @pageCount = @recordCount / @pageSize
else
set @pageCount = @recordCount / @pageSize + 1
--计算出记录是总数和求出总共的页数
begin
if @orderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by ' + @fldName +' desc'
--如果@orderType不是0﹐就执行降序﹐这句很重要﹗
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by ' + @fldName +' asc'
end
if @pageIndex = 1
begin
if @strWhere != ''
set @strSQL = 'select top ' + str(@pageSize) +' '+@strGetFields+ ' from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@pageSize) +' '+@strGetFields+ ' from '+ @tblName + ' '+ @strOrder
end
else
begin
if @strWhere != ''
set @strSQL = 'select top ' + str(@pageSize) +' '+@strGetFields+ ' from '
+ @tblName + ' where ' + @fldName + '' + @strTmp + '('
+ substring(@fldName, charindex('.',@fldName)+1, len(@fldName)) + ') from (select top ' + str((@pageIndex-1)*@pageSize) + ' '
+ @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@pageSize) +' '+@strGetFields+ ' from '
+ @tblName + ' where ' + @fldName + '' + @strTmp + '('
+ substring(@fldName, charindex('.',@fldName)+1, len(@fldName)) + ') from (select top ' + str((@pageIndex-1)*@pageSize) + ' '
+ @fldName + ' from ' + @tblName + '' + @strOrder + ') as tblTmp)'
+ @strOrder
end
end
--print @strSQL
exec sp_executesql @strSQL
GO
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 222.221.168.156