Usuário com melhor resposta
Como fazer um UPDATE de em auto-incremento?

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)
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.comMitos 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- Sugerido como Resposta Gustavo Maia Aguiar quinta-feira, 30 de julho de 2009 22:05
- Marcado como Resposta Leandro de Menezes da Silva sexta-feira, 31 de julho de 2009 17:44
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!!! -
-
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.comMitos 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 -
-
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.comMitos 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- Sugerido como Resposta Gustavo Maia Aguiar quinta-feira, 30 de julho de 2009 22:05
- Marcado como Resposta Leandro de Menezes da Silva sexta-feira, 31 de julho de 2009 17:44
-