万能存储过程分页

/* 
   参数说明: @tblName     需要查询的表名。如图书表tblbooks  。如果是多表(图书表关联图书分类表)则写成: tblbooks inner join tblbooktypes on tblbooks.bookid=tblbooktypes.bookid  
           @fldName      主键字段名 bookid  
       @listFldName  需要查询的字段。如:书名(tblbooks.bookname)、作者(tblbooks.author)、价格(tblbooks.price) 
       @orderFldName 需要排序的字段。 如(tblbooks.price)  我们以非主键且有重复字段价格字段进行排序 
      -- @orderFldType 需要排序的字段的类型。   因为price这段类型为float,所以我们这里设置值为"float"。 
           @PageSize     每页记录数   
           @PageIndex    要获取的页码 
           @OrderType    排序类型, 0 - 升序, 1 - 降序 
           @strWhere     查询条件 (注意: 不要加 where)
*/
CREATE   PROCEDURE GetRecordFromPage 
    @tblName      varchar(500),       
    @fldName      varchar(50),        
    @listFldName      varchar(255),        
    @orderFldName      varchar(50),        
    --@orderFldType      varchar(50),        
    @PageSize     int = 10,            
    @PageIndex    int = 1,             
    @OrderType    bit = 0,             
    @strWhere     varchar(2000) = ''  
AS 

declare @strSQL   nvarchar(4000)       -- 主语句 
declare @strTmp   varchar(1000)       -- 临时变量 
declare @strOrder varchar(500)        -- 排序类型 
declare @strOrder2 varchar(500)       --  
declare @orderFldValue nvarchar(1000)  --排序字段对应的值   
declare @keyFldValue nvarchar(1000)  --主键字段对应的值 add 
declare @operator char(1) --add by caoy 
declare @tempValueSql varchar(100) 
declare @strOrderby varchar(5) 
/*
if (@orderFldType='float') 
    set @tempValueSql='cast(@orderFldValue as float)' 
else 
 */   set @tempValueSql='@orderFldValue' 

--获取表明 。 
declare @tablename varchar(20) 
if charindex('.',@orderFldName)>1  
    set @tablename=left(@orderFldName,charindex('.',@orderFldName)-1) 
else 
    set @tablename=@orderFldName 
if @OrderType != 0   
begin 
    set @operator='<' 
    set @strOrderby=' desc' 
    set @strOrder2=' asc' 
end 
else 
begin 
    set @operator='>' 
    set @strOrderby=' asc' 
    set @strOrder2=' desc' 
end 
set @strOrder=' order by '+ @orderFldName+@strOrderby 
if @fldName!=@orderFldName  --如果排序字段不是主键字段,则增加主键排序 
    set @strOrder=@strOrder+','+@fldName+@strOrderby 
--先得到orderFldValue和keyValue  
set @strSQL='select top 1 @orderFldValue=convert(nvarchar(1000),'+@orderFldName+',20)'  /**//***注意,如果需要排序的字段的值长度超过Nvarchar(1000),请修改此处***********/ 
if @fldName!=@orderFldName   
    set @strSQL=@strSQL+',@keyFldValue='+@fldName 
else 
    set @strSQL=@strSQL+',@keyFldValue=1' 
set @strSQL=@strSQL+' from (select top ' + str((@PageIndex-1)*@PageSize) + ' ' 
    + @orderFldName  
if @fldName!=@orderFldName  --add by caoy 
    set @strSQL=@strSQL+','+@fldName 
set @strSQL=@strSQL+ ' from ' + @tblName + ''  
if @strWhere != '' 
    set @strSQL=@strSQL+ ' where '+@strWhere 
set @strSQL=@strSQL+ @strOrder + ') as '+@tablename+' order by ' + @orderFldName +@strOrder2 
if @fldName!=@orderFldName  --add by caoy 
    set @strSQL=@strSQL+',' + @fldName +@strOrder2 
--print @strSQL 
exec   sp_executesql @strSQL,N'@orderFldValue nvarchar(100) output,@keyFldValue nvarchar(1000) output',@orderFldValue output,@keyFldValue output    /**//***注意,如果需要排序的字段的值长度超过Nvarchar(1000),请修改此处***********/   
--得到排序字段值和主键值结束 

 

if @PageIndex = 1 
begin 
    set @strTmp = '' 
    if @strWhere != '' 
        set @strTmp = ' where (' + @strWhere + ')' 

    set @strSQL = 'select top ' + str(@PageSize) + ' '+ @listFldName+' from ' 
        + @tblName + '' + @strTmp + ' ' + @strOrder 
    exec (@strSQL) 
end 
else 
begin  
    --取得top数据并返回 
    set @strSQL = N'select top ' + str(@PageSize) +' ' +  @listFldName+' from ' 
        + @tblName + ' where ('+@orderFldName+@operator+@tempValueSql+' and @keyFldValue=@keyFldValue' 
    if @fldName!=@orderFldName  --add by caoy 
        set @strSQL=@strSQL+ ' or ('+@orderFldName+'='+@tempValueSql+' and '+@fldName+@operator+'@keyFldValue)) and (1=1' 
     
    if @strWhere != '' 
        set @strSQL=@strSQL+' and ' + @strWhere 
    set @strSQL=@strSQL+ ')'+@strOrder 
        if @fldName=@orderFldName          
        set @keyFldValue=1 
    --print @strSQL 
    exec sp_executesql @strSQL,N'@orderFldValue nvarchar(1000),@keyFldValue nvarchar(1000)',@orderFldValue,@keyFldValue       
end 

begin
 set @strTmp=N'select count(*) from '+@tblName
if @strWhere!=''
set  @strTmp =  @strTmp+' where '+@strWhere
exec(@strTmp)
end

SET QUOTED_IDENTIFIER OFF
GO
http://blog.csdn.net/cxjnet/archive/2007/11/16/1887978.aspx

posted @ 2009-07-27 12:10  Microbar  阅读(283)  评论(0编辑  收藏  举报