Hola 
 
Estoy en el mismo dilema que tu, pero creo que tengo una nocion o idea para la solucion espero que te sirva bastante, este codigo esta sacado del phpbb por si te funciona, me avisas ok?  
 Código PHP:
    <? //para indicar donde esta la pagina inicial de la paginacion
$start = ( isset($HTTP_GET_VARS['start']) ) ? intval($HTTP_GET_VARS['start']) : 0;
$start = 1;
// arreglo para guardar los datos requeridos en la consulta 
$topic_rowset = array();
//parametro para saber cuantos registros debemos mostrar en cada pagina
$topics_per_page=10;
// la consulta debe ser similar a mysql
$query = "SELECT idforo, nombreforo, tipoforo, descripcionforo FROM  foro WHERE estado = 'A' AND tipoforo = 2 ORDER BY idforo asc LIMIT ".$start.", ".$topics_per_page;
// de esta condicion sacamos los valores de limit por medio de expresiones regulares
    if( preg_match('#^SELECT(.*?)(LIMIT ([0-9]+)[, ]*([0-9]+)*)?$#s', $query, $limits) )
            {
                //oobtenemos la primera parte del query hasta el Limit
                $query = $limits[1];
//preguntamo sobre la existencia de la cadena LIMIT
                if( !empty($limits[2]) )
                {
                // sacamos el numero inicial de fila
                    $row_offset = ( $limits[4] ) ? $limits[3] : "";
                    //numero de filas a mostrar
                    $num_rows = ( $limits[4] ) ? $limits[4] : $limits[3];
                // adicionamos el Select top para que nos saque los n primeros registros
                    $query = "SELECT TOP " . ( $row_offset + $num_rows ) . $query;
                }
            }
//ejecutamos la consulta
                $result1 = mssql_query($query);
 
            if( $row_offset > 0 )
                    {
                        //nos posesionamos sobre la fila que empezaremos a mostrar
                        mssql_data_seek($result1, $row_offset);
                        
                    }        
/// indica el numero total de los registros que mostraremos 
$total_topics = 0;
//cargamos el arreglo envase a las consulta, aqui siempre toma a partir del $row_offset hacia adelante
while( $row1 = mssql_fetch_array($result1))
{
 
    $topic_rowset[] = $row1;
    $total_topics++;
 
    
}
//desplegamos de la siguiente manera en nuestra pagina
echo     echo " <table>";
    for($i = 0; $i < $total_topics; $i++)
    {
        echo "<tr><td>";
        echo $topic_rowset[$i]['idforo'];
        echo "</tr></td>";
    }
echo "</table>";
 
 
 
//funcion para generar la barra de navegacion 
function generate_pagination($base_url, $num_items, $per_page, $start_item, $add_prevnext_text = TRUE)
{
    global $lang;
 
    $total_pages = ceil($num_items/$per_page);
 
    if ( $total_pages == 1 )
    {
        return '';
    }
 
    $on_page = floor($start_item / $per_page) + 1;
 
    $page_string = '';
    if ( $total_pages > 10 )
    {
        $init_page_max = ( $total_pages > 3 ) ? 3 : $total_pages;
 
        for($i = 1; $i < $init_page_max + 1; $i++)
        {
            $page_string .= ( $i == $on_page ) ? '<b>' . $i . '</b>' : '<a href="' . append_sid($base_url . "&start=" . ( ( $i - 1 ) * $per_page ) ) . '">' . $i . '</a>';
            if ( $i <  $init_page_max )
            {
                $page_string .= ", ";
            }
        }
 
        if ( $total_pages > 3 )
        {
            if ( $on_page > 1  && $on_page < $total_pages )
            {
                $page_string .= ( $on_page > 5 ) ? ' ... ' : ', ';
 
                $init_page_min = ( $on_page > 4 ) ? $on_page : 5;
                $init_page_max = ( $on_page < $total_pages - 4 ) ? $on_page : $total_pages - 4;
 
                for($i = $init_page_min - 1; $i < $init_page_max + 2; $i++)
                {
                    $page_string .= ($i == $on_page) ? '<b>' . $i . '</b>' : '<a href="' . append_sid($base_url . "&start=" . ( ( $i - 1 ) * $per_page ) ) . '">' . $i . '</a>';
                    if ( $i <  $init_page_max + 1 )
                    {
                        $page_string .= ', ';
                    }
                }
 
                $page_string .= ( $on_page < $total_pages - 4 ) ? ' ... ' : ', ';
            }
            else
            {
                $page_string .= ' ... ';
            }
 
            for($i = $total_pages - 2; $i < $total_pages + 1; $i++)
            {
                $page_string .= ( $i == $on_page ) ? '<b>' . $i . '</b>'  : '<a href="' . append_sid($base_url . "&start=" . ( ( $i - 1 ) * $per_page ) ) . '">' . $i . '</a>';
                if( $i <  $total_pages )
                {
                    $page_string .= ", ";
                }
            }
        }
    }
    else
    {
        for($i = 1; $i < $total_pages + 1; $i++)
        {
            $page_string .= ( $i == $on_page ) ? '<b>' . $i . '</b>' : '<a href="' . append_sid($base_url . "&start=" . ( ( $i - 1 ) * $per_page ) ) . '">' . $i . '</a>';
            if ( $i <  $total_pages )
            {
                $page_string .= ', ';
            }
        }
    }
 
    if ( $add_prevnext_text )
    {
        if ( $on_page > 1 )
        {
            $page_string = ' <a href="' . append_sid($base_url . "&start=" . ( ( $on_page - 2 ) * $per_page ) ) . '">' . $lang['Previous'] . '</a>  ' . $page_string;
        }
 
        if ( $on_page < $total_pages )
        {
            $page_string .= '  <a href="' . append_sid($base_url . "&start=" . ( $on_page * $per_page ) ) . '">' . $lang['Next'] . '</a>';
        }
 
    }
 
    $page_string = $lang['Goto_page'] . ' ' . $page_string;
 
    return $page_string;
}
 
?>    
  
atte JULIO