Usuário com melhor resposta
Update para tabela ajuda2

Pergunta
-
Olá pessoal bom dia,
Eu abri recentemente um thread, porem como estive de licença nao testei, e infelizmente a resposta nao deu certo.
preciso da ajuda para o problema abaixo:
Tenho uma tabela que tem um campo chamado
CONTRIBUINTE --- VARCHAR (50)
Pela aplicação houve um erro e esse campo foi preenchido de forma errada em 2300 registros desta forma:
346380017201000
346380017201000
346380017201000
346380017201000
346380017201000
346380017201000
Ou seja todos os 2300 registros estao iguais,
Eu preciso agora fazer um update na tabela onde eu mude registro a registro de forma sequencial como abaixo:
346380017201001
346380017201002
346380017201003
346380017201004
346380017201005
346380017201006
346380017201007
346380017201008
346380017201009
346380017201010
346380017201011
Porem nao posso fazer com insert, pois existem outros campos nessa tabela que é chave primaria e relacionado com outras tabelas e nao da certo, entao precisava fazer com UPDATE.
Alguem poderia me ajudar?
Obrigado
Respostas
-
Carlos,
Dê uma olhada no script abaixo...
Veja que ele está bem semelhante ao primeiro, fiz apenas a alteração para que a ordem que o campo se encontra seja somada ao valor do contribuinte.
O que você vai precisar fazer, é alterar a CTE para refletir os teus campos (contribuinte e pk_id).
Não sei está claro para você, mas entenda que o update na CTE será refletida na tabela valores, você não está criando nenhuma tabela auxiliar.
-- Criação de uma tabela simulando a tabela com problemas CREATE TABLE VALORES (PK_ID int identity (1,1) primary key, CONTRIBUINTE VARCHAR(50), valor1 numeric(15,2) null, valor2 varchar(100) null ) GO INSERT INTO VALORES VALUES ('123123132123123',null,null) GO 1234 INSERT INTO VALORES VALUES ('741852963741852',null,null) GO 1234 INSERT INTO VALORES VALUES ('346380017201000',null,null) -- Inserção das 2300 linhas problemáticas, para serem atualizadas de acordo com a ordem do campo pk_id GO 2300 INSERT INTO VALORES VALUES ('564654654654654',null,null) GO 1234 ;WITH CTE AS (SELECT CONTRIBUINTE, row_number() OVER (ORDER BY PK_ID) AS LINHA FROM VALORES WHERE CONTRIBUINTE = '346380017201000') -- Crio uma CTE apenas com os registros que estão com problemas, ordenado pelo campo PK_ID UPDATE CTE SET CONTRIBUINTE = CONTRIBUINTE + LINHA -- Atualizo a tabela problemática, somando o campo contribuinte com a ocorrência do campo PK_ID select PK_ID,contribuinte from VALORES order by PK_ID --DROP TABLE VALORES
Espero que fique claro e que te ajude.
Caso tenha alguma dúvida ou enfrente algum erro, é só falar.
- Sugerido como Resposta Daniel_Lima sexta-feira, 4 de janeiro de 2013 17:38
- Marcado como Resposta Ricardo Russo quarta-feira, 9 de janeiro de 2013 11:38
Todas as Respostas
-
Olá Carlos,
Veja se o script te ajuda...
Veja que aqui, estou supondo que a numeração da coluna não vai importar qual registro será impactado, ele será apenas ordenado.
CREATE TABLE VALORES (CONTRIBUINTE VARCHAR(50)) GO INSERT INTO VALORES VALUES ('346380017201000') GO 2300 ;WITH CTE AS (SELECT CONTRIBUINTE, row_number() OVER (ORDER BY CONTRIBUINTE) AS LINHA FROM VALORES) UPDATE CTE SET CONTRIBUINTE = SUBSTRING(CONTRIBUINTE, 1, LEN(CONTRIBUINTE) - 4) + REPLICATE('0',4 - LEN(LINHA)) + CAST (LINHA AS VARCHAR(4)) select contribuinte from VALORES --DROP TABLE VALORES
Note que aqui estou fazendo um update direto na tabela, sem especificar nenhuma restrição.... Você deve aplicar a que se adequa ao seu cenário...
Espero ter ajudado.
[]'s!
- Editado Logan Destefani Merazzi quinta-feira, 3 de janeiro de 2013 17:14
- Sugerido como Resposta Eduardo Gomes Pereira quinta-feira, 3 de janeiro de 2013 17:24
-
o unico problema é que nao posso criar tabela, pois a mesma ja esta criada
como faco isso apenas com update?- Editado J.Carlos.Rib quinta-feira, 3 de janeiro de 2013 17:45 acres
-
Carlos,
A criação da tabela valores foi apenas um exemplo para você ver o comportamento do valor na coluna depois de atualizada.
Adapte a CTE para usar a tua tabela, lembrando que você deve fazer a alteração da consulta para não impactar nos demais registros existentes.
Espero ter ajudado.
[]'s!
-
Amigo seu comando nao funciona, ta com um monte de erro.
eu preciso comecar de um campo ID, ou seja
ID_1 = 346380017201001
ID_2 = 346380017201002
ID_3 = 346380017201003
eu teria que colocar no where, de que forma?
- Editado J.Carlos.Rib quinta-feira, 3 de janeiro de 2013 18:51 acres
-
Carlos,
Veja se fica mais claro... ordenando por ID...
;WITH CTE AS (SELECT CONTRIBUINTE, row_number() OVER (ORDER BY ID) AS LINHA FROM VALORES WHERE CONTRIBUINTE = '346380017201000') UPDATE CTE SET CONTRIBUINTE = SUBSTRING(CONTRIBUINTE, 1, LEN(CONTRIBUINTE) - 4) + REPLICATE('0',4 - LEN(LINHA)) + CAST (LINHA AS VARCHAR(4))
-
-
Carlos,
Em momento algum você falou que a solução não funciona e também não passou o erro que causa, nem o que você adaptou na consulta para tentar resolver e pelo visto não está conseguindo.
Como você mesmo falou, estamos aqui dispendendo nosso tempo tentando ajudar... estou fazendo o melhor possível com as informações que você me passou. Se você, que está em frente ao problema está achando complicado, imagina quem está completamente fora do ambiente.
Tente passar as informações mais completas, como as colunas das tabelas envolvidas e alguns registros.
A CTE funciona, executei ela várias vezes antes de postar, justamente para tentar passar as informações da forma mais correta possível (você tentou executar a consulta para ver o que ela faz?).
Tente dizer qual erro ocorreu, se foi de sintaxe, ou se o problema foi na alteração que você fez na consulta, ou se o problema é de integridade.
Quanto mais claro você for ao expor o problema, mais facilmente vamos poder te ajudar.
[]'s.
-
J.Carlos.Rib,
O script exemplo que o Logan postou funciona perfeitamente! Acabei de copiar o script e rodou com sucesso.
Se possível, por favor, poste mais detalhes sobre os erros que estão ocorrendo. Talvez seja um simples detalhe que impede a query rodar com sucesso.
Abs.
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
- Editado Eduardo Gomes Pereira quinta-feira, 3 de janeiro de 2013 20:09
-
Eu precisava disso, apenas com um update,
porem pelo que vi nao é possivel, no comando que ele me passou nao faz isso que precisava abaixo:
PK_ID Contribuinte
1 346380017201001
2 346380017201002
3 346380017201003
Ou seja o campo contribuinte ja esta preenchido com 2300 registros
desta forma:
PK_ID Contribuinte
1 3463800172010
2 3463800172010
3 3463800172010
Eu preciso fazer um update na tabela e ir numerando os ultimos digitos e ir ficando
desta forma:
PK_ID Contribuinte
1 346380017201001
2 346380017201002
3 346380017201003
4 346380017201004
5 346380017201005
A Tabela tem outros campos, e relacionamentos com demais tabelas, por isso nao da pra usar CREATE TABLE, entao preciso do update, estou precisando fazer essa correção porque foi um erro na aplicação, que esta sendo corrigido.
Então é isso, se alguem puder ajudar, agradeço.
obrigado a todos
-
Carlos,
Como eu havia falado inicialmente, o CREATE da tabela VALORES, foi apenas para você ver o update em execução. Não é para você criar absolutamente nada...
Porém, agora a situação mudou, pois agora você precisa que o valor do contribuinte seja concatenado com o valor da PK, o que até então não havia ficado claro... por isso eu havia feito uso do ROW_NUMBER, para que um sequencial fosse gerado.
Só que eu fiquei com uma dúvida...
Você falou que o contribuinte ficou com o valor 346380017201000
Como deve ficar o caso onde o contribuinte tenha a PK = 100 e PK = 1000?
Deve ser feita uma concatenação simples, ou o valor do contribuinte deve ser somado ao valor da PK, para manter a quantidade de caracteres?
Por exemplo:
Contibuinte: 346380017201000
PK_ID Solução 1 - Concatenação simples Solução 2 - Somatório 1 346380017201001 346380017201001 2 346380017201002 346380017201002 3 346380017201003 346380017201003 4 346380017201004 346380017201004 10 346380017201010 346380017201010 99 346380017201099 346380017201099 100 3463800172010100 346380017201100 999 3463800172010999 346380017201999 1000 34638001720101000 346380017202000 2300 34638001720102300 346380017203300
Como devem ficar os teus dados?
[]'s
-
Olá Logan, obrigado pela resposta,
Na verdade o PK_ID eu usei apenas para uma exemplo ( desculpe nao usar um exemplo melhor), porem na minha tabela real esta desta forma:
PK_ID Contribuinte
84952 3463800172010
84953 3463800172010
84954 3463800172010
84955 3463800172010
84956 3463800172010
Ou seja o que eu preciso é pegar na verdade o primeiro PK_ID como no exemplo acima que é 84952 e fazer a soma, no caso ficaria assim:
PK_ID Contribuinte
84952 346380017201001
84953 346380017201002
84954 346380017201003
84955 346380017201004
84956 346380017201005
Ou seja, tenho que pegar a primeiro pk_id e aplicar no contribuinte o numero 01,
ai o proximo pk_id , e aplicar o 02, no caso o proximo seria 84953.
Eu entendi sua duvida, que pelo que postei deu a entender que deveria concatenar o PK_ID no final do contribuinte, mas não é isso, o PK_ID vou precisar apenas para ordenar de como sera atualizado os numeros dos contribuintes, ou seja verifica o primeiro PK_ID que é o menor a aplica no Contribuinte no final o 01, proximo PK_ID e aplica o 02, e assim sucessivamente .
Então ficaria desta forma, por exemplo:
PK_ID Solução 1 - Concatenação simples Solução 2 - Somatório 84952 346380017201001 346380017201001 84953 346380017201002 346380017201002 84954 346380017201003 346380017201003 84955 346380017201004 346380017201004 84956 346380017201010 346380017201010 84957 346380017201099 346380017201099 84958 3463800172010100 346380017201100 84959 3463800172010999 346380017201999 84960 34638001720101000 346380017202000 84961 34638001720102300 346380017203300 Exemplo no PK_ID 84957, seria o registro 99, por isso devera atualizar com o 99 no final.
Assim como o PK_Id 84961 que é o registro 2300.
-
Carlos,
Dê uma olhada no script abaixo...
Veja que ele está bem semelhante ao primeiro, fiz apenas a alteração para que a ordem que o campo se encontra seja somada ao valor do contribuinte.
O que você vai precisar fazer, é alterar a CTE para refletir os teus campos (contribuinte e pk_id).
Não sei está claro para você, mas entenda que o update na CTE será refletida na tabela valores, você não está criando nenhuma tabela auxiliar.
-- Criação de uma tabela simulando a tabela com problemas CREATE TABLE VALORES (PK_ID int identity (1,1) primary key, CONTRIBUINTE VARCHAR(50), valor1 numeric(15,2) null, valor2 varchar(100) null ) GO INSERT INTO VALORES VALUES ('123123132123123',null,null) GO 1234 INSERT INTO VALORES VALUES ('741852963741852',null,null) GO 1234 INSERT INTO VALORES VALUES ('346380017201000',null,null) -- Inserção das 2300 linhas problemáticas, para serem atualizadas de acordo com a ordem do campo pk_id GO 2300 INSERT INTO VALORES VALUES ('564654654654654',null,null) GO 1234 ;WITH CTE AS (SELECT CONTRIBUINTE, row_number() OVER (ORDER BY PK_ID) AS LINHA FROM VALORES WHERE CONTRIBUINTE = '346380017201000') -- Crio uma CTE apenas com os registros que estão com problemas, ordenado pelo campo PK_ID UPDATE CTE SET CONTRIBUINTE = CONTRIBUINTE + LINHA -- Atualizo a tabela problemática, somando o campo contribuinte com a ocorrência do campo PK_ID select PK_ID,contribuinte from VALORES order by PK_ID --DROP TABLE VALORES
Espero que fique claro e que te ajude.
Caso tenha alguma dúvida ou enfrente algum erro, é só falar.
- Sugerido como Resposta Daniel_Lima sexta-feira, 4 de janeiro de 2013 17:38
- Marcado como Resposta Ricardo Russo quarta-feira, 9 de janeiro de 2013 11:38
-
Logan boa tarde,
o j.carlosrib, faz parte de nossa equipe.
Testei o script enviado por voce, a partir da linha CTE e esta 100% correto.
Agradeço pela sua ajuda a ele.
Obrigado.
MCP - MCTS
- Sugerido como Resposta Daniel_Lima sexta-feira, 4 de janeiro de 2013 17:38
-