none
Problema com quebra de linha ao criar arquivos XML com BCP RRS feed

  • Pergunta

  • Prezados Senhores,

    Estou tentando criar um arquivo XML a partir de uma query, selecionando algumas colunas de uma determinada tabela, porém estou tendo problema com o arquivo XML de saída, no tocante à quebra de linha, ou seja, o arquivo XML está sendo gerado direitinho com suas respectivas tags, porém não está quebrando linha, tag por tag, ou seja, está gerando uma "tripa" de texto imensa.

    Vou exemplificar para os senhores entenderem melhor o que está acontecendo. Estou usando o comando abaixo :

    EXEC XP_CMDSHELL 'BCP "select COL1, COL2, COL3 from BANCO..TABELA AS TABELA FOR XML AUTO, ELEMENTS, ROOT(''TABELA_SAIDA'')" queryout  D:\TABELA.XML -S. -T -c'

    Eu esperava que a saída deste comando fosse :

    <TABELA_SAIDA>
          <TABELA>
                <COL1>valor col1</COL1>
                <COL2>valor col2</COL2>
                <COL3>valor col3</COL3>
          </TABELA>
          <TABELA>
                  .
                  .
                  .
          </TABELA>
    </TABELA_SAIDA>

    Porém a saída do comando gerou um arquivo assim :

    <TABELA_SAIDA><TABELA><COL1>valor col1</COL1><COL2>valor col2</COL2><COL3>valor col3</COL3></TABELA><TABELA>...</TABELA></TABELA_SAIDA>

    Como eu devo fazer para que a saída do arquivo XML tenha quebra de linha ?


    Agradeço desde já a atenção e colaboração.

    José Luiz

     





    • Editado José Luiz SP quinta-feira, 3 de novembro de 2011 14:26
    quinta-feira, 3 de novembro de 2011 14:23

Respostas

  • Junior,

    Eu sei que a saída é texto. Inclusive a saida deste comando BCP é exatamente o que eu quero.

    Meu único problema é que eu quero quebrar linha entre as tags e subtags, só isso.

    Não tem necessidade de eu desenvolver um projeto no BIDs que seria muito mais complexo, quando eu já tenho o que quero.

    O único pequeno problema, reitero, é a quebra de linha.

    Se não conseguir fazer isso através de parâmetros no comando, eu já tenho uma solução de contorno.

    De qualquer forma, obrigado pela resposta.

    segunda-feira, 7 de novembro de 2011 11:18
  • Bom Dia,

    Eu defendo os argumentos do Jr. O BCP tem a finalidade de lidar com texto e não com documentos XML. Se o XML vier a ser consumido por uma aplicação, as tags estarem quebradas ou não fará diferença, pois, o conteúdo do documento se mantém (ainda que a formatação não seja a desejada).

    O uso do BIDS poderia ser utilizado, pois, uma vez que você possua uma pacote SSIS com saída em XML você poderá customizá-lo para receber a consulta dinâmica e gerar o arquivo dinâmico. Assim como o BCP, esse pacote poderia ser chamado via linha de comando, porém com maior flexibilidade que o BCP. O inconveniente é naturalmente a instalação do SSIS que dependendo do seu ambiente pode não estar disponível.

    Apenas na query com o BCP não creio ser possível. Você teria que fazer muitas customizações na consultas (acha CHAR(10) e CHAR(13)). É uma possibilidade, mas pode dar mais trabalho

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    segunda-feira, 7 de novembro de 2011 12:03

Todas as Respostas

  • José,

    Quando se utiliza o comando BCP o padrão para resultado de um arquivo é texto, mesmo que no comando você esteja especificando o formato em XML a saída será em texto.

    Acredito que o BCP não seja a melhor solução, já pensou em desenvolver um projeto no BIDS?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    domingo, 6 de novembro de 2011 00:18
    Moderador
  • Junior,

    Eu sei que a saída é texto. Inclusive a saida deste comando BCP é exatamente o que eu quero.

    Meu único problema é que eu quero quebrar linha entre as tags e subtags, só isso.

    Não tem necessidade de eu desenvolver um projeto no BIDs que seria muito mais complexo, quando eu já tenho o que quero.

    O único pequeno problema, reitero, é a quebra de linha.

    Se não conseguir fazer isso através de parâmetros no comando, eu já tenho uma solução de contorno.

    De qualquer forma, obrigado pela resposta.

    segunda-feira, 7 de novembro de 2011 11:18
  • Bom Dia,

    Eu defendo os argumentos do Jr. O BCP tem a finalidade de lidar com texto e não com documentos XML. Se o XML vier a ser consumido por uma aplicação, as tags estarem quebradas ou não fará diferença, pois, o conteúdo do documento se mantém (ainda que a formatação não seja a desejada).

    O uso do BIDS poderia ser utilizado, pois, uma vez que você possua uma pacote SSIS com saída em XML você poderá customizá-lo para receber a consulta dinâmica e gerar o arquivo dinâmico. Assim como o BCP, esse pacote poderia ser chamado via linha de comando, porém com maior flexibilidade que o BCP. O inconveniente é naturalmente a instalação do SSIS que dependendo do seu ambiente pode não estar disponível.

    Apenas na query com o BCP não creio ser possível. Você teria que fazer muitas customizações na consultas (acha CHAR(10) e CHAR(13)). É uma possibilidade, mas pode dar mais trabalho

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    segunda-feira, 7 de novembro de 2011 12:03
  • Gustavo,

    Bom dia ! Obrigado pela resposta.

    Mas, como disse antes, o resultado que eu quero já consegui, a despeito do BCP ser pra manipular texto. Com a query que fiz através do BCP, consegui o arquivo XML que eu quero. Meu problema (se é que pode ser chamado de problema, quando já se tem o que ser quer) é mero efeito de visualização do arquivo, que estava como uma sequência de caracteres imensa e não quebrando tag por tag, subtag por subtag.

    Apenas isso. Não faz sentido eu dispender um esforço de desenvolvimento de um pacote SSIS somente para isso, até porque eu já tenho o arquivo solução. Para a aplicação que irá lê-lo, realmente não faz diferença se está quebrando por tag/subtag ou se está contínuo.

    Só queria dar um efeito visual melhor no arquivo, para quando abri-lo via um Notepad, por exemplo.

    Mas eu já consegui uma solução de contorno da seguinte forma : basta executar o "SELECT FOR XML" no SSMS e depois clicar na linha de saída, e aí o SSMS irá abrir o XML, com quebra de linha por tag/subtag. Depois é só dar um "File / Save As" e pronto.

    Lá estará o arquivo XML salvo e com quebra de linha. Ou seja, o que eu queria é tão simples que não faria nenhum sentido desenvolver um pacote IS.

    Mas, de qualquer forma, obrigado pela resposta, mais uma vez.

    segunda-feira, 7 de novembro de 2011 12:28
  • Bom dia,

    Considerando que você teve de gerar o arquivo uma única vez (ou ainda de forma muito esporádica e não automatizada), o uso do SSMS é uma ótima opção. É mais fácil até que escrever o comando BCP e muito mais rápido que criar o pacote no SSIS.

    Entretanto, se você precisar automatizar o processo no futuro ou ainda estiver lidando com muitos arquivos, o SSMS não será uma alternativa muito viável. Nessa situação, você pode considerar o uso do SSIS ou refazer a consulta.

    É uma dúvida bem interessante essa sua. Vou ver se posto algumas soluções no blog qualquer hora dessas

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    segunda-feira, 7 de novembro de 2011 13:29
  • Gustavo,

    Bom dia ! É isso mesmo ! Você captou exatamente qual era minha necessidade. Eu precisava gerar esse arquivo XML "UMA ÚNICA" vez !

    Era o seguinte : Eu estava precisando apenas exportar algumas linhas de uma tabela, na qual existiam colunas do tipo TEXT (cada coluna dessa, tinha cerca de 50 mil caracteres de texto !), para uma aplicação "ad hoc" que leria esse arquivo XML (com as tags sendo as respectivas colunas desta tabela) e geraria estas linhas numa tabela do Oracle.

    Sei que você poderá acenar com outras soluções, mas o desenvolvedor Oracle queria que estas colunas estivesse num arquivo XML, por isso eu exportei para ele dessa forma, usando o BCP.

    Eu até tentei gerar um pacote SSIS para isso, isto é, para exportar diretamente estas linhas do SQL SERVER para a tabela Oracle, mas os campos TEXT eram transformados para CLOB, na tabela Oracle destino. Porém por algum motivo que eu não identifiquei, na hora que eu executava este pacote, somente duas linhas eram transferidas para o Oracle e, depois disso, a exportação travava. Parecia que estava rodando ainda, mas "congelava" nestas duas linhas (só que tinha cerca de 3000 linhas para serem exportadas !). Caso você saiba o real motivo deste problema, eu agradeceria muito se você o postasse !

    Foi por isso que parti para a solução com BCP.

    Mas foi aí que vi que o arquivo XML gerado não tinha quebra de linha nas tags e subtags. Como vi que seria demorado a busca de uma solução (se é que ela existe), e como é pra gerar o arquivo uma única vez, usei a solução de contorno que citei anteriormente, ou seja, executei o comando "SELECT FOR XML" no SSMS, cliquei no XML gerado e salvei num arquivo e esse sim gerado com quebras de linhas.

    Valeu por todas as dicas e, com certeza, será de grande valia se você postar soluções pra o problema no seu blog.

    Um abraço,

    José Luiz

    terça-feira, 8 de novembro de 2011 12:56