none
ler registros e quabrar em linhas RRS feed

  • Pergunta

  • eu tenho uma tabela que tem apenas uma coluna do tipo varchar(8000). tenho cadastrada várias linhas separadas por pipe (|). assim:

    coluna
    DATA_BASE|textbox10|textbox47|textbox43|textbox54|textbox55|textbox63|textbox64|textbox65|textbox68|textbox11|textbox96|textbox92|COD_AGRUP_CONTABIL
    DATA_BASE1|textbox101|textbox471|textbox431|textbox541|textbox551|textbox631|textbox641|textbox651|textbox681|textbox111|textbox961|textbox921|COD_AGRUP_CONTABIL
    .
    .
    .
    .
    .


    eu preciso fazer uma forma que quando encontre o pipe separar por campo, para poder cada uma ser uma linha

    segunda-feira, 29 de outubro de 2012 14:46

Respostas

  • cara, consgui fazer um código mais exuto e menor. dá uma olhada:

    declare @filename varchar(100), @bulk varchar(2000)
    set @filename = 'C:\PROJETOS\arquivo.txt'
    Create table #tempfile (line varchar(8000))
     
     --pode - ser usar o comando abaixo...
      exec ('bulk insert #tempfile from "' + @filename + '" with (CODEPAGE=''ACP'')')
    --ou esse comando
    set @bulk = 'bulk insert #tempfile from "' + @filename + '" with (CODEPAGE=''ACP'')'
    exec(@bulk)
    DECLARE @xml as xml,@str as varchar(4000),@delimiter as varchar(10)
    SET @str='coluna1|coluna2|coluna3|coluna4|coluna5'
    SET @xml = cast(('<X>'+replace(@str,';' ,'</X><X>')+'</X>') as xml)
    SELECT ShrededData as DesiredResult FROM(
    SELECT 
    ROW_NUMBER() over(order by getdate()) rn
    ,N.value('.', 'varchar(4000)') as ShrededData FROM @xml.nodes('X') as T(N))X

    referência http://stackoverflow.com/questions/1924600/find-position-of-delimited-character-in-a-string-sql-server

    adaptei o que preciso e ficou show de bola.

    mesmo assim value pela ajuda.


    com isso, consegui melhorar mais aquele código que postei no post anterior, onde é possível ler arquivo txt ou csv e criar uma tabela dinâmica com a quantidade de colunas que vem no arquivo e por fim inserir os dados do txt ou csv de acordo com a coluna do arquivo (não importando a ordem da coluna no arquivo).
    • Marcado como Resposta rafa-martin segunda-feira, 29 de outubro de 2012 17:17
    • Editado rafa-martin segunda-feira, 29 de outubro de 2012 17:19 resposta incompleta
    segunda-feira, 29 de outubro de 2012 17:17

Todas as Respostas

  • Rafa-Martin, isto será algo recorrente ou voce terá que fazer apenas uma vez ? Se for apenas uma vez voce pode exportar sua tabela para um arquivo txt ou csv sem delimitador ja que ja existe o | entre as colunas e depois importar este arquivo para o banco usando como delimitador o |.

    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    segunda-feira, 29 de outubro de 2012 14:49
  • isso é recorrente. é de um arquivo txt (que não tenho acesso) e seus dados é enviado nessa tabela.

    o que preciso quebrar esses registros em linhas a cada pipe encontrado.

    como poderia fazer?

    segunda-feira, 29 de outubro de 2012 15:46
  • Se entendi bem, voce quer a cada | encontrado transforma-los em linhas e não colunas, certo ? Se for isto, voce terá que utilizar charindex e substring, da uma olhada no que fiz, criei um looping que faz a contagem de linhas do tabela e para cada passada no looping ele adiciona os caracteres que estão antes do | para uma nova tabela e ao final tira esta parte da tabela original voltando ao looping até que não tenha mais | ou caracteres, tente assim:

    create table #teste (coluna varchar(8000))
    create table #teste2 (coluna varchar(50))
    
    insert into #teste
    select 'Alexandre Matayosi|Rafa-Martin|Forum|MSDN'
    insert into #teste
    select 'teste1|teste2|teste3|teste4'
    
    declare @times int
    set @times = (select COUNT(*) from #teste)
    
    while @times <> 0
    begin
    
    insert into #teste2
    select coluna from #teste
    where LTRIM(rtrim(coluna)) <> ''
    and coluna not like '%|%'
    
    insert into #teste2
    select substring(Coluna,1,CHARINDEX('|', coluna) -1) from #teste
    where LTRIM(rtrim(coluna)) <> ''
    
    update #teste
    set coluna = LTRIM(rtrim(Coluna))
    
    update #teste
    set coluna = RIGHT(coluna,len(coluna) - CHARINDEX('|', coluna))
    
    delete from #teste
    where LTRIM(rtrim(Coluna)) = ''
    or coluna not like '%|%'
    
    set @times = (select COUNT(*) from #teste)
    
    end
    


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    segunda-feira, 29 de outubro de 2012 16:54
  • cara, consgui fazer um código mais exuto e menor. dá uma olhada:

    declare @filename varchar(100), @bulk varchar(2000)
    set @filename = 'C:\PROJETOS\arquivo.txt'
    Create table #tempfile (line varchar(8000))
     
     --pode - ser usar o comando abaixo...
      exec ('bulk insert #tempfile from "' + @filename + '" with (CODEPAGE=''ACP'')')
    --ou esse comando
    set @bulk = 'bulk insert #tempfile from "' + @filename + '" with (CODEPAGE=''ACP'')'
    exec(@bulk)
    DECLARE @xml as xml,@str as varchar(4000),@delimiter as varchar(10)
    SET @str='coluna1|coluna2|coluna3|coluna4|coluna5'
    SET @xml = cast(('<X>'+replace(@str,';' ,'</X><X>')+'</X>') as xml)
    SELECT ShrededData as DesiredResult FROM(
    SELECT 
    ROW_NUMBER() over(order by getdate()) rn
    ,N.value('.', 'varchar(4000)') as ShrededData FROM @xml.nodes('X') as T(N))X

    referência http://stackoverflow.com/questions/1924600/find-position-of-delimited-character-in-a-string-sql-server

    adaptei o que preciso e ficou show de bola.

    mesmo assim value pela ajuda.


    com isso, consegui melhorar mais aquele código que postei no post anterior, onde é possível ler arquivo txt ou csv e criar uma tabela dinâmica com a quantidade de colunas que vem no arquivo e por fim inserir os dados do txt ou csv de acordo com a coluna do arquivo (não importando a ordem da coluna no arquivo).
    • Marcado como Resposta rafa-martin segunda-feira, 29 de outubro de 2012 17:17
    • Editado rafa-martin segunda-feira, 29 de outubro de 2012 17:19 resposta incompleta
    segunda-feira, 29 de outubro de 2012 17:17