none
Ajuda Simples (While ou Cursor) RRS feed

  • Pergunta

  • Pessoal, Bom Dia!
    
    Como faço para que determinada coluna (NUMREG) de uma tabela com 49 registros comece com conteúdo 
    1 no primeiro registro e termine com conteúdo 49 no último registro? 
    (Atualmente o Conteúdo dessa Coluna é Igual a 0 para todos os registros)
    
    Exemplo Simplificado:
    
    Hoje Está Assim:
    
    PAIS        |   NUMREG
    Brasil       |    0
    Paraguay  |    0
    Chile        |    0
    
    Quero Que Fique Assim:
    
    PAIS        |   NUMREG
    Brasil       |    1
    Paraguay  |    2
    Chile        |    3
    
    "...e assim sucessivamente até:
    
    China       |    49
    
    Tentei fazer um While, mas todos os Registros da Coluna NUMREG está recebendo o valor 49. ='[
    
    DECLARE @contador int
    SET @contador = 0
    
    WHILE @contador < 50
    BEGIN	
    	UPDATE ALÇADA 
    	SET NUMREG  = @contador
    	WHERE NUMREG = @contador	
    	SET @contador = @contador+1
    END
    
    
    
    Também tentei fazer com Ponteiro, mas ocorre a mesma coisa:
    
    SET NOCOUNT ON
                                             
    DECLARE @NUMREG INT
    DECLARE @CONTADOR INT 
    SET @CONTADOR = 1
    
    --NOME CONTADOR
    DECLARE ATUALIZA CURSOR FOR 
    
    --DECLARAÇÃO SELECT
    SELECT NUMREG
    FROM ALÇADA
    
    --ABRE CURSOR
    OPEN ATUALIZA
    
    --MOVIMENTA CURSOR
    FETCH NEXT FROM ATUALIZA
    INTO @NUMREG
    
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
    
    	UPDATE ALÇADA
    	SET	NUMREG = @CONTADOR
    	SET @CONTADOR = @CONTADOR + 1
    	
    
    
       FETCH NEXT FROM ATUALIZA
       INTO @NUMREG
    END
    
    
    CLOSE ATUALIZA
    DEALLOCATE ATUALIZA
    GO  
    
    
    
    
    
    
    Onde estou errando e/ou que  preciso fazer ???
    
    terça-feira, 6 de outubro de 2009 14:38

Respostas

  • Opa, faltou o tipo dele: ROWID=IDENTITY(int,1,1)

    []'s
    • Marcado como Resposta Denison Soares terça-feira, 17 de agosto de 2010 20:18
    terça-feira, 6 de outubro de 2009 15:44
  • Olá Denison, não sei como está a estrutura da sua tabela.

    Mas no SQL 2000 ao invés de você criar um CTE, crie uma tabela temporária a partir do teu select e faça o update dela.

    Exemplo:

    select RowId=identity(1,1), pais
    INTO #TABELA
    from ALÇADA

    Então você atualiza sua tabela com essa tabela temporária.

    UPDATE
     ALÇADA
    SET ALÇADA.NUMREG = #TABELA.RowId
    FROM ALÇADA INNER JOIN #TABELA ON ALÇADA.PAIS = #TABELA.PAIS
    E depois exclui a tabela temporária.

    []'s
    terça-feira, 6 de outubro de 2009 15:35

Todas as Respostas

  • Olá Denison.

    Se for SQL 2005 uma das maneiras que você pode fazer é assim:

    ;With CTE AS
    (
    SELECT ROW_NUMBER() OVER(ORDER BY PAIS ASC) As Row,
        PAIS, NUMREG
    FROM ALÇADA
    )
    UPDATE ALÇADA
    SET ALÇADA.NUMREG = CTE.ROW
    FROM ALÇADA INNER JOIN CTE ON ALÇADA.PAIS = CTE.PAIS

    Ele vai pegar o ROW_NUMBER() e atualizar o campo NUMREG.

    Lembrando que ele vai ordenar a coluna pelo nome do país antes de atualizar.

    []'s
    terça-feira, 6 de outubro de 2009 14:56
  • Patrício, mesmo meu SQL sendo o 2000 testei por teimosia Rs ...e disparada a mensagem de Função não Reconhecida (ROW_NUMBER) ...Huheueheh

    Como posso fazer no SQL 2000?
    terça-feira, 6 de outubro de 2009 15:22
  • Olá Denison, não sei como está a estrutura da sua tabela.

    Mas no SQL 2000 ao invés de você criar um CTE, crie uma tabela temporária a partir do teu select e faça o update dela.

    Exemplo:

    select RowId=identity(1,1), pais
    INTO #TABELA
    from ALÇADA

    Então você atualiza sua tabela com essa tabela temporária.

    UPDATE
     ALÇADA
    SET ALÇADA.NUMREG = #TABELA.RowId
    FROM ALÇADA INNER JOIN #TABELA ON ALÇADA.PAIS = #TABELA.PAIS
    E depois exclui a tabela temporária.

    []'s
    terça-feira, 6 de outubro de 2009 15:35

  • Patrício, está dando erro na linha: select RowId=identity(1,1)

    Deve ser devido o sql não reconhecer o comando Identity.  Posso user algum outro?
    terça-feira, 6 de outubro de 2009 15:40
  • Opa, faltou o tipo dele: ROWID=IDENTITY(int,1,1)

    []'s
    • Marcado como Resposta Denison Soares terça-feira, 17 de agosto de 2010 20:18
    terça-feira, 6 de outubro de 2009 15:44
  • Certo Patricio!!!! Deu Certo!!!

    Isso sim que é MVP, hein!!! ...huehuehueheuh

    ObrigadO!!!

    []s
    Denison Soares


    terça-feira, 6 de outubro de 2009 15:49
  • Que nada, longe, bem longe.....rs....

    Só marque como resposta a solução.

    []'s
    terça-feira, 6 de outubro de 2009 15:53