none
Anexo de Xml por e-mail não funciona RRS feed

  • Pergunta

  • Pessoal,

    Estou desenvolvendo uma procedure que envia uma consulta XML em anexo por e-mail. Está tudo ok até o envio, porém ao tentar abrir com o navegador, excel ou qualquer outro software para leitura de Xml, é apontado um erro. 

    Desconfio que seja o encoding do arquivo que está sendo gerado, pois criei um Xml na mão e funcionou corretamente em todos os softwares. Copiei o conteúdo do que estava funcionando e colei no que foi gerado e enviado pelo banco, assim era pra funcionar, porém, tive o mesmo problema.

    Alguém já passou por isso ou tem alguma rotina que envia Xml por e-mail que funcione?

    Segue código abaixo:

    --Setando o MSDB como banco a ser utilizado
    USE msdb;
    ------------------------------------
    DECLARE @strSQLQuery NVARCHAR(MAX)= '
    Set noCount ON;
    SELECT 
    	Replace(cd_vend,''  '','''') as idvendedor,
    	Replace(nome_gue,''  '','''') as nome
    	FROM MOINHO.dbo.vendedor as vendedor
    	FOR XML AUTO
    	, ELEMENTS,TYPE;
    	
    	Set noCount OFF;
    	
    	'
    
    EXEC msdb.dbo.sp_send_dbmail
    	@profile_name = 'Relatorios',
        @recipients = 'teste@teste.com.br'
    	,@body = 'Tabela de vendedores'
    	,@subject = 'Tabela de vendedores'
    	,@query = @strSQLQuery
    	,@attach_query_result_as_file = 1
    	,@query_attachment_filename = 'vendedor.xml'
    	,@query_result_width = 32767
    	,@query_result_header = 0
    	,@body_format = 'HTML'
    	, @query_no_truncate =	1;

    quarta-feira, 1 de agosto de 2012 21:56

Respostas

  • Pessoal,

    Desculpe a demora. Descobri o que acontecia!

    A consulta gerada pelo banco, possui aqueles caracteres ocultos de quebra de linha e tabulação todos desformatados, não permitindo a leitura por qualquer browser ou software que leia Xml.

    A solução é pegar a @strQuery e remover todos esses caracteres com REPLACE() e depois formatar o Xml com as identações cabíveis. Segue como ficou:

    USE msdb;
    ------------------------------------
    
    --------------------------
    Declare @Qry NVarchar(Max) =
    	'Set noCount ON;
    	Select ''<vendedores>'';
    	
    	Select 
    	Replace(
    	Replace(
    	Replace(
    	Replace(
    	Replace(
    	Cast(
    	(
    	SELECT 
    		cd_vend as idvendedor,
    		nome_gue as nome
    		FROM MOINHO.dbo.vendedor as vendedor
    		FOR XML AUTO
    		, ELEMENTS,TYPE
    	)
    	as nVarchar(Max)),
    	CHAR(13) + Char(10) ,'''')
    	,''<vendedor>'',CHAR(9)+''<vendedor>''+CHAR(10)+CHAR(9)+CHAR(9))
    	,''</vendedor>'',''</vendedor>''+CHAR(10)) 
    	,''</idvendedor>'',''</idvendedor>''+CHAR(10)+CHAR(9)+CHAR(9))
    	,''</nome>'',''</nome>''+CHAR(10)+CHAR(9))
    	
    	as [Vendedor]
    
    Select ''</vendedores>'';
    	
    	Set nocount  off;
    	'
    ---------------------------
    EXEC msdb.dbo.sp_send_dbmail
    	@profile_name = 'Relatorios',
        @recipients = 'teste@teste.com.br'
    	,@body = 'Tabela de vendedores'
    	,@subject = 'Tabela de vendedores'
    	,@query = @Qry
    	,@attach_query_result_as_file = 1
    	,@query_attachment_filename = 'vendedor.xml'
    	,@query_result_width = 32767
    	,@query_result_header = 0
    	,@body_format = 'HTML'
    	, @query_no_truncate =	1;

    Essa funcionou perfeitamente.

    Agradeço a todos pela atenção.

    Abraço!


    Davis

    • Marcado como Resposta Davi Giles terça-feira, 7 de agosto de 2012 20:37
    terça-feira, 7 de agosto de 2012 20:37

Todas as Respostas

  • Bom dia Davi,

    Acredito que não esteja conseguindo abrir o xml corretamente porque o FOR XML não adiciona uma tag root no arquivo, acredito que se adicionar a tag de raiz funcione.

    sexta-feira, 3 de agosto de 2012 12:35
  • Davi,

    Ao meu ver você precisa referenciar o caminho do arquivo .xml na opção @query_attachment_filename.


    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]

    sexta-feira, 3 de agosto de 2012 15:12
  • Pessoal,

    Desculpe a demora. Descobri o que acontecia!

    A consulta gerada pelo banco, possui aqueles caracteres ocultos de quebra de linha e tabulação todos desformatados, não permitindo a leitura por qualquer browser ou software que leia Xml.

    A solução é pegar a @strQuery e remover todos esses caracteres com REPLACE() e depois formatar o Xml com as identações cabíveis. Segue como ficou:

    USE msdb;
    ------------------------------------
    
    --------------------------
    Declare @Qry NVarchar(Max) =
    	'Set noCount ON;
    	Select ''<vendedores>'';
    	
    	Select 
    	Replace(
    	Replace(
    	Replace(
    	Replace(
    	Replace(
    	Cast(
    	(
    	SELECT 
    		cd_vend as idvendedor,
    		nome_gue as nome
    		FROM MOINHO.dbo.vendedor as vendedor
    		FOR XML AUTO
    		, ELEMENTS,TYPE
    	)
    	as nVarchar(Max)),
    	CHAR(13) + Char(10) ,'''')
    	,''<vendedor>'',CHAR(9)+''<vendedor>''+CHAR(10)+CHAR(9)+CHAR(9))
    	,''</vendedor>'',''</vendedor>''+CHAR(10)) 
    	,''</idvendedor>'',''</idvendedor>''+CHAR(10)+CHAR(9)+CHAR(9))
    	,''</nome>'',''</nome>''+CHAR(10)+CHAR(9))
    	
    	as [Vendedor]
    
    Select ''</vendedores>'';
    	
    	Set nocount  off;
    	'
    ---------------------------
    EXEC msdb.dbo.sp_send_dbmail
    	@profile_name = 'Relatorios',
        @recipients = 'teste@teste.com.br'
    	,@body = 'Tabela de vendedores'
    	,@subject = 'Tabela de vendedores'
    	,@query = @Qry
    	,@attach_query_result_as_file = 1
    	,@query_attachment_filename = 'vendedor.xml'
    	,@query_result_width = 32767
    	,@query_result_header = 0
    	,@body_format = 'HTML'
    	, @query_no_truncate =	1;

    Essa funcionou perfeitamente.

    Agradeço a todos pela atenção.

    Abraço!


    Davis

    • Marcado como Resposta Davi Giles terça-feira, 7 de agosto de 2012 20:37
    terça-feira, 7 de agosto de 2012 20:37
  • Junior,

    Boa tarde.

    Seria útil caso fosse escrever no disco, porém esse parâmetro é o nome que o arquivo vai no e-mail. Serviu muito para colocar também o formato a ser enviado ".xml".

    Obrigado.


    Davis

    terça-feira, 7 de agosto de 2012 20:40
  • Bruna,

    Sua resposta foi útil para não colocar a tag root na mão, assim a consulta a gera automaticamente.

    Obs: editei o arquivo na mão com a tag root, mas não ia. Tirei todas as identações geradas pela consulta e refiz na mão, dai foi.

    Simplesmente editei o código para fazer esse trabalho.

    Obrigado.


    Davis


    • Editado Davi Giles terça-feira, 7 de agosto de 2012 20:45
    terça-feira, 7 de agosto de 2012 20:41