none
Como fazer um UPDATE de em auto-incremento? RRS feed

  • Pergunta

  • Boa tarde, estou querendo fazer um UPDATE em um campo na tabela para corrigir a codificação de alguns produtos, mas a codificação é baseada no tipo de produto que foi cadastrado, por exemplo: tenho um produto do tipo FRALDAS DESCARTÁVEIS com o código 0500, se eu cadastrar FRALDA DESCARTÁVEL TAM. G CREMER, o codigo gerado deve ser 050001, até aí nenhum segredo, pois no codigo fonte do sistema, isto já está sendo feito, mas havia um erro no sistema, e a codificação automática não ocorreu, ou seja, todos os produtos cadastrados foram gerados com a sequência de códigos do primeiro produto cadastrado, tipo assim: 020001,020002,020003,...,020099..., existem um a campo no bd que armazena a codificação do tipo, mas não estou conseguindo fazer um update que me atualize todos os produtos cadastrados de um determinado tipo de forma autoincremental. Como posso fazer isso???
    • Movido Gustavo Maia Aguiar sexta-feira, 31 de julho de 2009 20:32 (De:SQL Server - Desenvolvimento Geral)
    quinta-feira, 30 de julho de 2009 17:08

Respostas

  • Boa Noite,

    Segue um exemplo próximo...

    DECLARE @T TABLE (SEQUENCIAL CHAR(9) NULL, PROD INT, DATA SMALLDATETIME)
    INSERT INTO @T VALUES (NULL,1,'20090720')
    INSERT INTO @T VALUES (NULL,1,'20090721')
    INSERT INTO @T VALUES (NULL,1,'20090722')
    INSERT INTO @T VALUES (NULL,20,'20090718')
    INSERT INTO @T VALUES (NULL,20,'20090719')
    INSERT INTO @T VALUES (NULL,20,'20090726')
    INSERT INTO @T VALUES (NULL,20,'20090729')
    ;WITH SEQ As (
     SELECT PROD, DATA, ROW_NUMBER() OVER (PARTITION BY PROD ORDER BY DATA) As Pos
     FROM @T)
    UPDATE T SET SEQUENCIAL = 'PROD' +
     RIGHT('0'+CAST(T.PROD AS VARCHAR(2)),2) + '_' +
     RIGHT('0'+CAST(SEQ.POS AS VARCHAR(2)),2)
    FROM @T AS T
    INNER JOIN SEQ ON T.PROD = SEQ.PROD AND T.DATA = SEQ.DATA
    SELECT * FROM @T


    [ ]s,
     
    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Mitos do SQL Server – Será que COUNT(1) ou COUNT('X') são mais performáticos que COUNT(*) ?
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!658.entry


    Classifique as respostas. O seu feedback é imprescindível
    quinta-feira, 30 de julho de 2009 22:04

Todas as Respostas

  • Leandro,

    Este assunto ja foi muito comentado aqui no forum...
    Vc não vai conseguir fazer um update de uma coluna identity (vc tera que remover esta carateristica e fazer um outro tipo de controle p/ numeracao se vc realmente quiser eliminar o identity)

    sugiro uma pesquisa aqui no forum por "identity"

    Att.

    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    quinta-feira, 30 de julho de 2009 17:23
  • Ok, eu sei disso mas a coluna não é Identy, inclusive o tipo de dados é varchar(15), só preciso de um update que atualize a codificação da seguinte forma:

    IDProduto = IDTipo & (000 + 1), onde, IDTipo = 0500, que ficaria assim: 0500001
    quinta-feira, 30 de julho de 2009 17:35
  • Boa Noite,

    Não acho que essa seja uma boa implementação, mas requisito é requisito.

    Qual é o seu SQL Server ?

    [ ]s,
     
    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Mitos do SQL Server – Será que COUNT(1) ou COUNT('X') são mais performáticos que COUNT(*) ?
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!658.entry


    Classifique as respostas. O seu feedback é imprescindível
    quinta-feira, 30 de julho de 2009 21:39
  • Eu faria de forma diferente, mas já funcionava assim antes de eu começar a trabalhar aqui.

    SQL Server 2005 Standard.
    quinta-feira, 30 de julho de 2009 21:44
  • Boa Noite,

    Segue um exemplo próximo...

    DECLARE @T TABLE (SEQUENCIAL CHAR(9) NULL, PROD INT, DATA SMALLDATETIME)
    INSERT INTO @T VALUES (NULL,1,'20090720')
    INSERT INTO @T VALUES (NULL,1,'20090721')
    INSERT INTO @T VALUES (NULL,1,'20090722')
    INSERT INTO @T VALUES (NULL,20,'20090718')
    INSERT INTO @T VALUES (NULL,20,'20090719')
    INSERT INTO @T VALUES (NULL,20,'20090726')
    INSERT INTO @T VALUES (NULL,20,'20090729')
    ;WITH SEQ As (
     SELECT PROD, DATA, ROW_NUMBER() OVER (PARTITION BY PROD ORDER BY DATA) As Pos
     FROM @T)
    UPDATE T SET SEQUENCIAL = 'PROD' +
     RIGHT('0'+CAST(T.PROD AS VARCHAR(2)),2) + '_' +
     RIGHT('0'+CAST(SEQ.POS AS VARCHAR(2)),2)
    FROM @T AS T
    INNER JOIN SEQ ON T.PROD = SEQ.PROD AND T.DATA = SEQ.DATA
    SELECT * FROM @T


    [ ]s,
     
    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Mitos do SQL Server – Será que COUNT(1) ou COUNT('X') são mais performáticos que COUNT(*) ?
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!658.entry


    Classifique as respostas. O seu feedback é imprescindível
    quinta-feira, 30 de julho de 2009 22:04
  • Gustavo muito obrigado, me ajudou bastante.
    sexta-feira, 31 de julho de 2009 17:44