Com o lançamento do Denali, finalmente irá acabar a era das paginações baseadas em sub consultas no SQL Server, surgindo algo semelhante ao LIMIT OFFSET que temos no MySQL e PostGreSQL, conforme demonstrado abaixo:
-- Primeira página SELECT FirstName, LastName, ContactID FROM Person.Contact ORDER BY ContactID OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY -- Próxima página SELECT FirstName, LastName, ContactID FROM Person.Contact ORDER BY ContactID OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
Mas como eram feitas as paginações antes do Denali?
Com ROW_NUMBER:
-- Primeira página SELECT FirstName, LastName, ContactID FROM ( SELECT ROW_NUMBER() OVER (ORDER BY ContactID) AS Registro ,FirstName ,LastName ,ContactID FROM Person.Contact ) AS Contact WHERE Registro BETWEEN 1 AND 10 -- Próxima página SELECT FirstName, LastName, ContactID FROM ( SELECT ROW_NUMBER() OVER (ORDER BY ContactID) AS Registro ,FirstName ,LastName ,ContactID FROM Person.Contact ) AS Contact WHERE Registro BETWEEN 11 AND 20
Com TOP:
-- Próxima página SELECT FirstName, LastName, ContactID FROM ( SELECT TOP 10 FirstName, LastName, ContactID FROM ( SELECT TOP 20 FirstName ,LastName ,ContactID FROM Person.Contact ORDER BY ContactID ) AS Contact ORDER BY ContactID DESC ) AS Contact ORDER BY ContactID
Com tabela temporária:
-- Próxima página CREATE TABLE #TMP ( Registro INT IDENTITY(1, 1) PRIMARY KEY ,FirstName NVARCHAR(100) NOT NULL ,LastName NVARCHAR(100) NOT NULL ,ContactID INT NOT NULL ) INSERT INTO #TMP SELECT TOP 20 FirstName ,LastName ,ContactID FROM Person.Contact ORDER BY ContactID SELECT FirstName, LastName, ContactID FROM #TMP WHERE Registro BETWEEN 11 AND 20 DROP TABLE #TMP
Se alguém tiver alguma contribuição de outra forma de paginação das antigas versões do SQL Server, pode enviar, que ela poderá ser colocada no blog!
Hoje, comecei a acreditar no poder do MS Connect:
https://connect.microsoft.com/SQLServer/feedback/details/124495/implement-limit-keyword
Demorou pra ter isso dai hein!
Até que enfim hehe
Massa!
show de bola né…
eu no SQL 2005+ sempre usei CTE para fazer isso na verdade, não gosto muito de sub-consultas, acho a manutenção e a leitura do código um pouco mais complicada.. usava o ROW_NUMBER() dentro da CTE, criando uma coluna nova chamada Linha.. e aí depois era só consultar a CTE filtrando pela coluna nova..
abs.
Felipe Ferreira – @SQLBoy