SQL Server – Paginar registros de un DataSet o RecordSet.

En artículos previos mostré como podemos paginar registros tanto en PostgreSQL como en DB2 por lo que ahora tocar el turno a SQL Server. Para esta entrada haremos uso de la base de datos de prueba proporcionada por Microsoft y que en este artículo aprendimos a realizar un attach con ella: Attach y Dettach en SQL Server 2012.

En SQL Server 2012 se ha incluido entre otras mejoras, la cláusula OFFSET ROWS y FETCH.  OFFSET nos permite establecer el número de filas que se omitirán antes de comenzar a devolver registros. ¿Te recuerda a la sentencia OFFSET de PostgreSQL?. Un ejemplo de lo  que podemos obtener con OFFSET es suponiendo lo siguiente: Dada la tabla de Personas en la base  de datos AdventureWorks2012, nos solicitan obtener a las últimas 100 personas registradas. Ello puede resolverse fácilmente de la siguiente manera:

SELECT BusinessEntityID, PersonType, NameStyle, FirstName,
       MiddleName, LastName
  FROM AdventureWorks2012.Person.person
  ORDER by BusinessEntityID ASC
OFFSET (select count(*) 
          FROM AdventureWorks2012.Person.person
       ) - 100 ROWS

Como lo establecer la documentación, el número de filas a omitir puede ser un valor constante, un parámetro o variable o en su defecto una subconsulta de tipo escalar, tal y como vimos en la sentencia SQL anterior. Es muy importante mencionar que la cláusula Order  By es obligatoria al usar OFFSET. El resultado de la consulta sería algo como lo siguiente:

sql_server_offset

Ahora bien, para la paginación de registros en SQL Server,  será necesario hacer uso de FETCH {FIRST/NEXT}. El uso de First o Next es indistinto, ambos nos darán el mismo resultado.  Tenemos entonces que su uso para poder paginar registros  se usará la siguiente regla:   OFFSET (Número de filas a omitir) ROWS FETCH NEXT (Número de filas a obtener) ONLY.

Haciendo uso de la regla tenemos que para paginar de 100 en 100 registros haremos uso de la siguiente sentencia SQL:

SELECT BusinessEntityID, PersonType, NameStyle, 
       FirstName, MiddleName, LastName
  FROM AdventureWorks2012.Person.person
  order by BusinessEntityID asc
  OFFSET 100 ROWS 
 FETCH NEXT 100 ROWS ONLY;

Sentencia de verdad muy sencilla pero que no nos permite automatizar la paginación de registros. Si deseamos crear una consulta SQL a quien proporcionemos el número de página tendremos que hacer algo como lo siguiente:

DECLARE @regporpagina int;  -- Registros a devolver por página
DECLARE @pagina int;        -- pagina a devolver

SET @pagina = 3;
SET @regporpagina = 100

SELECT BusinessEntityID, PersonType, NameStyle, 
       FirstName, MiddleName, LastName
  FROM AdventureWorks2012.Person.Person
  ORDER BY BusinessEntityID ASC
  OFFSET (@regporpagina * (@pagina - 1)) ROWS 
 FETCH NEXT @regporpagina ROWS ONLY;

 

1 Comment

1 Trackback / Pingback

  1. Linea de Codigo Lenguajes de Programación | Los Infos

Deja un comentario