Pessoas que tiveram o contato com o Oracle e ja utilizaram a função que enumera as linhas de uma consulta (o RowNumber) percebem uma certa facilidade para utilização.
E ai derrepente você se depara com uma necessidade deste tipo no SQL Server e fica aquela pergunta: Como faz?
Esta postagem tem o objetivo de apresentar 2 soluções para esta situação:
- Utilizando uma tabela temporária com IDENTITY
- Utilizando a função ROW_NUMBER() OVER (ORDER BY COLUMN_NAME).
Uma pequena obsevação sobre o segundo método é que ele funciona a partir do SQL Server 2005.
Chega de papo e vamos para a ação.
Inicialmente vamos criar uma tabela temporária (que no caso seria a tabela onde tem os dados que você buscará os dados):
-
- CREATE TABLE #TAB_CLIENTES(
- CODIGO INT,
- NOME VARCHAR(200))
- GO
--CRIA TABELA TEMPORÁRIA
CREATE TABLE #TAB_CLIENTES(
CODIGO INT,
NOME VARCHAR(200))
GO
Agora vamos incluir alguns registros para testes e consulta-los:
-
- INSERT INTO #TAB_CLIENTES (CODIGO, NOME) VALUES (1, 'MARIA')
- INSERT INTO #TAB_CLIENTES (CODIGO, NOME) VALUES (2, 'ALEX')
- INSERT INTO #TAB_CLIENTES (CODIGO, NOME) VALUES (3, 'BRUNA')
-
-
- SELECT *
- FROM #TAB_CLIENTES
--INCLUINDO DADOS PARA TESTE
INSERT INTO #TAB_CLIENTES (CODIGO, NOME) VALUES (1, 'MARIA')
INSERT INTO #TAB_CLIENTES (CODIGO, NOME) VALUES (2, 'ALEX')
INSERT INTO #TAB_CLIENTES (CODIGO, NOME) VALUES (3, 'BRUNA')
--VERIFICANDO REGISTROS INSERIDOS
SELECT *
FROM #TAB_CLIENTES
O resultado até o momento será:

Agora que temos o cenário montado, vamos ao primeiro método.
Note que é criada uma tabela temporária para então executar o select nesta, e quem dita a ordem de numeração de linhas é o ORDER BY.
Segue:
-
- SELECT IDENTITY(INT, 1, 1) AS ROWNUMBER, CODIGO, NOME
- INTO #TMP
- FROM #TAB_CLIENTES ORDER BY NOME
-
- SELECT * FROM #TMP
--MÉTODO 1
SELECT IDENTITY(INT, 1, 1) AS ROWNUMBER, CODIGO, NOME
INTO #TMP
FROM #TAB_CLIENTES ORDER BY NOME
SELECT * FROM #TMP
O resultado é:

Para o segundo método, note que não é necessário a criação da tabela temporária e quem dita a numeração é o ORDER BY da função.
Segue o script:
-
- SELECT ROW_NUMBER() OVER (ORDER BY NOME) AS ROWNUMBER, *
- FROM #TAB_CLIENTES
- ORDER BY NOME
--MÉTODO 2
SELECT ROW_NUMBER() OVER (ORDER BY NOME) AS ROWNUMBER, *
FROM #TAB_CLIENTES
ORDER BY NOME
O resultado será como o do primeiro método.
Espero que tenha ajudado. Quaisquer dúvidas comente.
Se desejar fazer o download do script -> Script_RowNumber.sql (722,00 bytes).
Até a próxima.
Conhecer o homem, esta é a base de todo o sucesso. (Charles Chaplin)
Mais informações:
ROW_NUMBER - http://msdn.microsoft.com/en-us/library/ms186734.aspx
IDENTITY - http://msdn.microsoft.com/en-us/library/aa933196%28SQL.80%29.aspx
Tags: rownumber, sql, sqlserver, oracle, mssql, contador, enumerar linhas, T-SQL, tabela temporária, ROW_NUMBER, OVER, order by, IDENTITY, SQL Server 2005, Transact-SQL, rownum, rownum sql server, row_number sql, rownumber sql, rownum sql server 2000, rownum sql server 2005, rownum sql