- -分页的sql

老生常谈~~这个不是我写的不过加入了分析在最下面~~
/Files/ajaxren/分析过的排序.rar


alter PROCEDURE GetRecordFromPage1 
    
@tblName      varchar(255),       -- 表名
    @fldName      varchar(255),       -- 字段名
    @PageSize     int = 10,           -- 页尺寸
    @PageIndex    int = 1,            -- 页码
    @IsCount      bit = 0,            -- 返回记录总数, 非0 值则返回
    @OrderType    bit = 0,            -- 设置排序类型, 非0 值则降序
    @strWhere     varchar(4000= ''  -- 查询条件(注意: 不要加where) 
AS 
 
declare  @strSQL   varchar(6000)     -- 主语句
declare @strTmp   varchar(6000)     -- 临时变量
declare @strOrder varchar(6000)       -- 排序类型
 
if @OrderType != 0 --降序排列--select min 该函数返回列中最小的非NULL值
begin 
    
set @strTmp = '<(select min'
    
set @strOrder = ' order by [' + @fldName +'] desc'-- @fldName 是要排序的字段
end 
else 
begin --升序排列
    set @strTmp = '>(select max'
    
--设置排序类型
    set @strOrder = ' order by [' + @fldName +'] asc'
end 
 
set @strSQL = 'select top ' + str(@PageSize+ ' * from [' 
    
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '([' 
    
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize+ ' [' 
    
+ @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)' 
    
+ @strOrder 
 
--print @strSQL
if @strWhere != '' 
    
set @strSQL = 'select top ' + str(@PageSize+ ' * from [' 
        
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '([' 
        
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize+ ' [' 
        
+ @fldName + '] from [' + @tblName + '] where (' + @strWhere + '' 
        
+ @strOrder + ') as tblTmp) and (' + @strWhere + '' + @strOrder 
 
--由于函数不能处理pageindex=1所以有一个特别的函数处理
if @PageIndex = 1 
begin 
    
set @strTmp = ''
    
if @strWhere != '' 
        
set @strTmp = ' where (' + @strWhere + ')' 
 
    
set @strSQL = 'select top ' + str(@PageSize+ ' * from [' 
        
+ @tblName + ']' + @strTmp + ' ' + @strOrder 
end 
 
--由于函数不能处理pageindex=0所以有一个特别的函数处理 
if @IsCount != 0 
    
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' 
 
exec (@strSQL
--print @strSQL
GO 

--执行函数
exec GetRecordFromPage1 'Table_1','Tab_Id',2,1,0,1


--思路首先跟巨你输入的一页显示多少条纪录分页然后根据显示几页设置数据
--
---一页显示多少条纪录]--生序
select top 5 *from Table_1  where [Tab_Id]>--我只取纪录中的5条,并且是生序的但是有个要求主键id必须大与一个条件(由于有这个条件在如果条件是1则取1后面的5条)
(select max([Tab_Id])--在下面的查询中找到最大的字段数据用于上面的筛选
--
------------显示第几页------这里是控制上面说的条件的-比如这里是1则上面显示第一条后面的饿
fromselect top 1 [Tab_Id]from Table_1 order by [Tab_Id] ascas tblTmp)order by [Tab_Id] asc



--降序-首先到序是从最后往前显示,第一行显示的是原来升须最后一条数据
--
显示几条数据------------设置条件必须小于其实和大于一样就是向下推
select top          2 * from [Table_1] where [Tab_Id]--如果下面返回id是则显示5,4的信息因为是降序
<(select min([Tab_Id]from --根据下面的临时表查询找到最小的id用于上面的刷选
--
这里显示的是1,2条纪录--当然也是降序的
(select top          2 [Tab_Id] from [Table_1] order by [Tab_Id] descas tblTmp) order by [Tab_Id] desc

//--------------------------------------
select top          2 * from [Table_1]控制一次显示的字段
where [Tab_Id]是筛选的条件就是控制数据向下移动的 如果这个条件是3那么取的是第3条以后的
生序
>,降序< 目的都是往后推数据
(
select min([Tab_Id]from-是取得下面数据中最小的数据用于降序
(
select max([Tab_Id])  from-是取得下面数据中最大的用于生序
//--上面2条选1个就可以了配合>或者<使用

select top 1 [Tab_Id]from Table_1 order by [Tab_Id] ascas tblTmp)order by [Tab_Id] asc
--这1句是找到从上面开始属的数据-存入临时表-好给上面2条数语句检索最大或者是最小数据
posted @ 2007-04-24 22:07  苹果王子  阅读(563)  评论(1编辑  收藏  举报