Usuário com melhor resposta
Anexo de Xml por e-mail não funciona

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;
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
Todas as Respostas
-
-
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]
-
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
-
-
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