none
Duvida com Função ROW_NUMBER RRS feed

  • Pergunta

  • Bom dia a todos, estou com a seguinte duvida, tenho duas tabelas uma é de produtos e uma outra pra gera uma sequência criei uma proc que é rodada durante a madrugada que estara atualizando a segunda tabela (sequência) preciso que se não ouver o produto na tabela ele insira somando a ultima sequência +1,  estou tentando faze isso utilizando a opção ROW_NUMBER mas não estou conseguindo pega a ultima sequência da tabela pra que o ROW_NUMBER continue fazendo a sequência, lembrando que pra faze isso não estou querendo utilizar cursor se ouver outra forma pra mim esta fazendo isso aceito opniões, obrigado a todos..
    sábado, 24 de abril de 2010 04:18

Respostas

  • Andre,

    Nesse caso não seria melhor utilizar a propriedad Identity ao invês de trabalhar com este função Row_Number?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    • Marcado como Resposta Andre_Bel segunda-feira, 26 de abril de 2010 14:02
    domingo, 25 de abril de 2010 01:35
  • André, bom dia segue um exemplo q mostra os ids q estão faltando.

    pode ser q seja útil.

    DECLARE @Temp TABLE (CodNum Int)
     
    INSERT @Temp 
    SELECT (01) UNION 
    SELECT (02) UNION 
    SELECT (03) UNION 
    SELECT (05) UNION 
    SELECT (07) UNION 
    SELECT (08) UNION 
    SELECT (09) UNION 
    SELECT (10)
    
    SELECT 
      Q.Prox
    FROM
      ( 
       SELECT CodNum,(SELECT MIN(CodNum) FROM @Temp AS A WHERE A.CodNum > B.CodNum) - 1 AS Prox
       FROM  @Temp AS B
      ) AS Q
    WHERE 
      CodNum != Prox

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    • Marcado como Resposta Andre_Bel segunda-feira, 26 de abril de 2010 14:02
    domingo, 25 de abril de 2010 15:38

Todas as Respostas

  • Boa Tarde Andre,

    Se a tabela "SEQUENCIA" guarda todos os Id's já inseridos na tabela "PRODUTO", então pra descobrir o próximo número da sequencia, acredito que o código abaixo resolve:

    DECLARE @ProximoId INT
    
    SELECT @ProximoId = MAX(Id) + 1 
    FROM Sequencia

    Espero ter ajudado.

     

    Abraço

     


    hã?
    sábado, 24 de abril de 2010 22:10
  • Boa noite Dtito, obrigado pela colaboração. MAs como irei inserir todos os registros que não existam na tabela de sequência ??? segue meu script:

    -- Achar o ultimo sequencial da tabela Z_PROSEQ
    SELECT @V_sequen = MAX( sequen )
    FROM   widl.Z_PROSEQ

    SET @V_sequnc1 = 1

    PRINT 'SEQUÊNCIA  _' + CONVERT(CHAR,@V_procod)

    --Conta quantos registros não existem na tabela Z_PROSEQ

    SELECT  @V_cont = COUNT(*)
      FROM   widl.PROD01 a1
     WHERE  NOT EXISTS( SELECT * FROM widl.Z_PROSEQ a2 WHERE a1.procod = a2.procod )

    PRINT 'PRODUTO  _' + CONVERT(CHAR,@V_procod)

    BEGIN TRAN

     WHILE @V_cont >= @V_sequnc1

      BEGIN
       SET @V_sequen = @V_sequen + 1
       SET @V_sequnc1 = @V_sequnc1 + 1

       PRINT 'SEQUÊNCIA WHILE' + CONVERT(CHAR,@V_sequen)

       INSERT INTO widl.Z_PROSEQ    
        SELECT  a1.procod, @V_sequen
          FROM   widl.PROD01 a1 LEFT JOIN widl.Z_PROSEQ a2  ON a1.procod = a2.procod
         WHERE  NOT EXISTS(
             SELECT a2.procod
               FROM widl.Z_PROSEQ a2
              WHERE a2.procod = a1.procod
               )

       PRINT 'INSERT'
      
       UPDATE widl.PROD01
          SET    proems = (
             SELECT sequen
               FROM   widl.Z_PROSEQ
              WHERE widl.Z_PROSEQ.procod = widl.PROD01.procod
              )
     IF @@ERROR <> 0
      BEGIN
       COMMIT TRAN
       PRINT 'SUCESSO!!!'
      END
     ELSE
      BEGIN
       ROLLBACK TRAN
       PRINT 'FUDEU'
      END
      END

     

    sábado, 24 de abril de 2010 23:41
  • Andre,

    Nesse caso não seria melhor utilizar a propriedad Identity ao invês de trabalhar com este função Row_Number?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    • Marcado como Resposta Andre_Bel segunda-feira, 26 de abril de 2010 14:02
    domingo, 25 de abril de 2010 01:35
  • André, bom dia segue um exemplo q mostra os ids q estão faltando.

    pode ser q seja útil.

    DECLARE @Temp TABLE (CodNum Int)
     
    INSERT @Temp 
    SELECT (01) UNION 
    SELECT (02) UNION 
    SELECT (03) UNION 
    SELECT (05) UNION 
    SELECT (07) UNION 
    SELECT (08) UNION 
    SELECT (09) UNION 
    SELECT (10)
    
    SELECT 
      Q.Prox
    FROM
      ( 
       SELECT CodNum,(SELECT MIN(CodNum) FROM @Temp AS A WHERE A.CodNum > B.CodNum) - 1 AS Prox
       FROM  @Temp AS B
      ) AS Q
    WHERE 
      CodNum != Prox

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    • Marcado como Resposta Andre_Bel segunda-feira, 26 de abril de 2010 14:02
    domingo, 25 de abril de 2010 15:38
  • André,

    Você chegou a pensar na possibilidade de utilizar o Identity?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    segunda-feira, 26 de abril de 2010 13:50
  • Bom dia a todos, obrigado Leonardo pela força, Junior realmente não avia pensado na possibilidade, fiz os testes utilizando o IDENTITY e deu certinho como eu precisava, muito obrigado, Leonardo farei um teste com a sua solução pra que eu possa esta utilizando ela em uma outra proc qualquer, obrigado...
    segunda-feira, 26 de abril de 2010 14:02