【摘要】

这个存储过程的功能比较强大,用在项目中非常的适用,尤其是在百万级数据上。


【全文】


SQL代码

CREATE PROCEDURE prcPageResult    
-- 获得某一页的数据 --    
@currPage int = 1,                                    --当前页页码 (即Top currPage)    
@showColumn varchar(2000) = '*',           --需要得到的字段 (即 column1,column2,
)    
@tabName varchar(2000),                           --需要查看的表名 (即 from table_name)    
@strCondition varchar(2000) = '',              --查询条件 (即 where condition
) 不用加where关键字    
@ascColumn varchar(100) = '',                 --排序的字段名 (即 order by column asc/desc)    
@bitOrderType bit = 0,                            --排序的类型 (0为升序,1为降序)    
@pkColumn varchar(50) = '',                   --主键名称    
@pageSize int = 20                                --分页大小    
   
AS   
BEGIN -- 存储过程开始    
-- 该存储过程需要用到的几个变量 --    
DECLARE @strTemp varchar(1000)    
DECLARE @strSql varchar(4000)                   --该存储过程最后执行的语句    
DECLARE @strOrderType varchar(1000)      --排序类型语句 (order by column asc或者order by column desc)    
   
BEGIN   
IF @bitOrderType = 1   -- bitOrderType=1即执行降序    
BEGIN   
    SET @strOrderType = ' ORDER BY '+@ascColumn+' DESC'   
    SET @strTemp = '<(SELECT min'   
END   
ELSE   
BEGIN   
    SET @strOrderType = ' ORDER BY '+@ascColumn+' ASC'   
    SET @strTemp = '>(SELECT max'   
END   
   
IF @currPage = 1    -- 如果是第一页    
BEGIN   
    IF @strCondition != ''   
        SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+    
            ' WHERE '+@strCondition+@strOrderType    
    ELSE   
        SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+@strOrderType    
END   
   
ELSE    -- 其他页    
BEGIN   
    IF @strCondition !=''   
        SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+    
        ' WHERE '+@strCondition+' AND '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+    
        ' '+@pkColumn+' FROM '+@tabName+@strOrderType+') AS TabTemp)'+@strOrderType    
    ELSE   
        SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+    
        ' WHERE '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+' '+@pkColumn+    
        ' FROM '+@tabName+@strOrderType+') AS TabTemp)'+@strOrderType    
END   
   
END   
EXEC (@strSql)    
END  -- 存储过程结束    
------------------------------------------------    
GO    
 调用方法:

prcPageResult 1,'*','TableName','','CreateDate',1,'PkID',25

 上面表示,查询表TableName的所有字段,前25条记录,因为是第一页,排序字段为CreateDate,降序排列,主键是PkID。
@tabName2 varchar(2000),                     --第二个子查询的表名------------(更改处:由于查询条件关系,从而使tabName是两个表,这样第二个子查询也会用上这两张表..导致错误..)

可将有条件查询的第二个Top查询里的tabName改成tabName2,,