none
Update para tabela ajuda2 RRS feed

  • 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

    quinta-feira, 3 de janeiro de 2013 16:43

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
    sexta-feira, 4 de janeiro de 2013 17:05

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!



    quinta-feira, 3 de janeiro de 2013 17:11
  • 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
    quinta-feira, 3 de janeiro de 2013 17:44
  • 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!

    quinta-feira, 3 de janeiro de 2013 17:51
  • 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
    quinta-feira, 3 de janeiro de 2013 18:29
  • 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))



    quinta-feira, 3 de janeiro de 2013 18:56
  • haa desisto..

    ninguem aqui tem obrigação de ajudar, entendo que o forum é um lugar que as pessoas voluntarias se dedicam, de forma voluntaria e ajudam como podem.

    Porem dai a passar coisas que nao funcionam, tambem nao acho legal.

    quinta-feira, 3 de janeiro de 2013 19:01
  • 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.

    quinta-feira, 3 de janeiro de 2013 19:29
  • 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


    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

    sexta-feira, 4 de janeiro de 2013 09:57
  • 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

    sexta-feira, 4 de janeiro de 2013 10:36
  • 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.

    sexta-feira, 4 de janeiro de 2013 11:59
  • 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
    sexta-feira, 4 de janeiro de 2013 17:05
  • 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
    sexta-feira, 4 de janeiro de 2013 17:38
  • Olá Daniel.

    Que bom que deu tudo certo, as vezes um problema é mais complicado de entender do que a solução em si. :-)

    []'s!

    sexta-feira, 4 de janeiro de 2013 17:54