none
alterar itens da linha RRS feed

  • Pergunta

  • O processo é o seguinte.

    Fiz a extração de 14 milhões de linhas em uma tabela com duas colunas: a primeira com o indice da linha e a segunda com a linha por extenso (tamanho 500).

    Nessa linha grande tenho alguns dados do tipo 0000E ou 0000} (com caracteres e letras no final).

    Nessa linha eu preciso transformar as letras em números

    por ex: 0000000000025611E em 00000000000256115 

        0000000000255002{ em 00000000002550020

       0000000000025611M em -00000000000256114 

    e     0000000000255002} em -00000000002550020

    De acordo com a tabela

    positivo negativo
    de para de para
    { 0 } 0
    A 1 J 1
    B 2 K 2
    C 3 L 3
    D 4 M 4
    E 5 N 5
    F 6 O 6
    G 7 P 7
    H 8 Q 8
    I 9 R 9

    Eu criei uma função para fazer essa conversão ao separar os campos com o comando SUBSTRING.

    por ex 

    mas agora precisaria que fosse feita diretamente na linha a alteração (inclusive se o campo estiver com caractere negativo, colocar o sinal na frente - cada campo tem 17 posições e é sempre na ultima que aparece esse caractere).

    Existe alguma maneira de fazer um update em itens específicos da linha ou usando um replace?

    []

    quarta-feira, 5 de setembro de 2012 18:36

Respostas

  • A função STUFF poderá te ajudar

    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    • Marcado como Resposta Fernando.Jarcen quarta-feira, 5 de setembro de 2012 20:58
    quarta-feira, 5 de setembro de 2012 19:54
    Moderador

Todas as Respostas

  • Fernando

    Segue uma paossibildiade....

    declare @TbTeste as table (valores varchar(20))
    insert into @TbTeste values ('0000000000025611E'),('0000000000255002{'),('0000000000025611M'),('0000000000255002}')
    declare @tbDePara as Table (de char(1), para tinyint, sinal char(1))
    insert into @tbDePara values
    ('{',0,'+'),('}',0,'-'),
    ('A',1,'+'),('J',1,'-'),
    ('B',2,'+'),('K',2,'-'),
    ('C',3,'+'),('L',3,'-'),
    ('D',4,'+'),('M',4,'-'),
    ('E',5,'+'),('N',5,'-'),
    ('F',6,'+'),('O',6,'-'),
    ('G',7,'+'),('P',7,'-'),
    ('H',8,'+'),('Q',8,'-'),
    ('I',9,'+'),('R',9,'-')
    select case when b.sinal = '-' then sinal else '' end+left(valores,len(valores)-1)+cast(para as char(1))
    From @TbTeste a inner join @tbDePara b on right(valores,1) = b.de


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    quarta-feira, 5 de setembro de 2012 19:02
    Moderador
  • Marcelo.

    Me ajudou muito sua técnica porém a linha é extensa e cada valor (moeda) é que tem o tamanho máximo 17 (e são campos específicos em alguma posição).

    Ex: 010010001002202207110117004010000001620303NENHUMA DAS ANTERIORES    0000000000004774H0000000000000000{0000000000000000{0000000000000000{0000000000000000{0000000000000000{0000000000000000{0000000000000000{0000000000000000{0000000000000169880 331102008000000000004E 151120080000000000000000{100000000010EP0001243272888881008888000000000000000000000{0000000000000000{0000000000008448J0000000000000000{0000000000000000{0000000000000000{010102210002206000000010000

    Por exemplo a string = SUBSTRING(linha,73,17) retornaria 0000000000004774H e eu teria q alterar e colocar nessa linha gigante (se for negativo, colocar o sinal na frente).

    É possível apenas com função ou seria mais viável uma procedure?

    []                                  

    quarta-feira, 5 de setembro de 2012 19:16
  • A função STUFF poderá te ajudar

    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    • Marcado como Resposta Fernando.Jarcen quarta-feira, 5 de setembro de 2012 20:58
    quarta-feira, 5 de setembro de 2012 19:54
    Moderador
  • Ok, essa função vai me ajudar e muito.

    Obrigado.

    quarta-feira, 5 de setembro de 2012 20:58