none
Mostrar o número da linha retornado pelo Select no Sql 2000 ? RRS feed

  • Pergunta

  • Select codigo, nome from clientes

    o retorno seria :

     

    001 - Adriano

    002 - Leandro

    .... e assim por diante , Seria possivel eu criar uma coluna com o número da linha exemplo:

     

    1 - 001 - Adriano

    2 - 002 - Leandro

    3 - 005 - Pedro

    ... e assim por diante ?

     

    Desde já agradeço

     

    quarta-feira, 23 de janeiro de 2008 11:31

Todas as Respostas

  • Bom Dia,

     

    Por coincidência, acabamos de sugerir como fazer isso em uma Thread no "SQL Server Geral". Uma possível sugestão no SQL Server 2000 é:

     

    Code Snippet

    CREATE TABLE #tbl (CODIGO INT, NOME VARCHAR(20))

    INSERT INTO #tbl (CODIGO, NOME) VALUES (15,'JUQUINHA')

    INSERT INTO #tbl (CODIGO, NOME) VALUES (17,'ZEQUINHA')

    INSERT INTO #tbl (CODIGO, NOME) VALUES (18,'PEDRINHO')

    INSERT INTO #tbl (CODIGO, NOME) VALUES (21,'MARIAZINHA')

    INSERT INTO #tbl (CODIGO, NOME) VALUES (32,'CAMILINHA')

    SELECT

    (SELECT COUNT(CODIGO) FROM #tbl AS T2 WHERE T2.CODIGO <= T1.CODIGO) AS Pos,

    CODIGO, NOME

    FROM #tbl AS T1

    DROP TABLE #tbl

     

     

    Opcionalmente você pode utilizar uma tabela temporária com o Identity.

     

    [ ]s,

     

    Gustavo

    quarta-feira, 23 de janeiro de 2008 11:41
  • Gustavo,

     

    Prefiro realmente utilizar table temporária com Identity.

     

    quarta-feira, 23 de janeiro de 2008 12:57
  •  

    Olá Adriano,

     

    Como o Gustavo disse, acabamos de responder outra pergunta muito parecida. Segue o exemplo que postei lá:

     

    Code Snippet

    WITH ClientesComPosicao AS(

    SELECT ROW_NUMBER () OVER (ORDER BY EmployeeID) AS POS, Codigo, Nome

    FROM Clientes

    )

    SELECT POS, Codigo, Nome FROM ClientesComPosicao WHERE AlgumCampo = Valor

     

     

     

     

    Este é o link original: http://forums.microsoft.com/MSDN-BR/ShowPost.aspx?PostID=2725601&SiteID=21

     

     

     

    Abraço

    quarta-feira, 23 de janeiro de 2008 12:57
  • Oi Jr.

     

    A temporária com Identity é uma alternativa (e algumas vezes a melhor alternativa). O problema é que essa alternativa onera mais o I/O por conta da escrita em disco enquanto o COUNT onera mais a CPU por conta do processamento. Com a subquery sendo executada a cada linha temos o que alguns chamam de Partial Scan. É possível diminuir parte desse overhead se o campo código estiver indexado. Como na maioria dos ambientes o I/O costuma ser mais limitando eu acabado postando sempre a do COUNT, mas a temporária também pode funcionar muito bem (mesmo em ambientes com pressões sobre I/O).

     

    O fato é que a medida em que a quantidade de registros aumenta, ambas as soluções (ou até eventualmente um cursor) começam a degradar. É por isso que, como citado pelo Alexandre no outro post, a alternativa do Row_Number é bem melhor (pena que só no 2005).

     

    [ ]s,

     

    Gustavo

    quarta-feira, 23 de janeiro de 2008 13:07
  • Adriano, segue um código de exemplo:

     

    Code Snippet

    DECLARE @tbClientes TABLE (Idx INT Identity(1,1), NomeCliente VARCHAR(100))

     

    INSERT INTO @tbClientes (NomeCliente)

    (SELECT NomeCliente FROM dbo.clientes)

     

    SELECT Idx, NomeCliente FROM dbo.clientes

     

     

     

    Espero que ajude!

     

    Abraços,

    quarta-feira, 23 de janeiro de 2008 13:10
  • Olá Rodrigo, entendi, mas realmente acredito que não será possível está utilizando dessa forma.

     

    Pois o meu select é retornado em um determinado recordset pela aplicação, ou seja, eu passo um único select e é retornado um cursor ou mais precisamente, um cursor em dbf.

     

    De qualquer forma obrigado, tentarei resolver isso através do gerador de relatório talvez seja possível.

     

    Abraços,

     

    Adriano

    quarta-feira, 23 de janeiro de 2008 13:56
  • Adriano bom dia.
    Olha eu acho que entendi o que você está precisando.
    Eu estava precisando retornar um ID para cada tipo de logradouro da tabela de cep.
    Montei o seguine select, para cada linha um id:
    usei o cast para converter o resultado do row_number para inteiro, assim eu consigo trabalhar com o recordset ou mesmo o dataset ou então um selectedvalue no combobox.

    SELECT

     

    CAST(ROW_NUMBER() OVER(ORDER BY CepTipoLogradouro) AS INTEGER) AS Id, CepTipoLogradouro FROM Cep WITH(NOLOCK) GROUP BY CepTipoLogradouro

    quarta-feira, 13 de maio de 2009 11:41
  • Sérgio,

    Mas este código é compatível com o SQL Server 2005!!!


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 13 de maio de 2009 14:42