Como Alterar a Codificação de Anexos no sp_send_dbmail para SQL Server

Enviar e-mails com anexos através do SQL Server pode ser uma tarefa relativamente simples. No entanto, se você encontrar um problema onde o anexo é enviado como codificado em UCS-2 e deseja que ele seja codificado em ANSI ou UTF-8, você não está sozinho. Muitos usuários enfrentaram problemas semelhantes, especialmente ao usar o procedimento armazenado sp_send_dbmail no SQL Server 2005. Neste post do blog, discutiremos o problema e forneceremos uma solução para garantir que seus anexos sejam codificados corretamente.

O Problema

Ao usar a funcionalidade sp_send_dbmail para enviar os resultados de consultas SQL como anexos, você pode perceber que os resultados estão codificados no formato UCS-2. Este formato pode ser problemático para os destinatários, pois pode não ser compatível com várias aplicações que esperam formatos ANSI ou UTF-8.

Cenário Exemplo

No seu cenário, a consulta que você executa com sp_send_dbmail é a seguinte:

EXEC msdb.dbo.sp_send_dbmail
    @recipients = 'temp@example.com',
    @query = 'DECLARE @string_to_trim varchar(60);SET @string_to_trim = ''1234''; select rtrim(@string_to_trim), ''tom''',
    @query_result_header=0,
    @subject = 'ver anexo',
    @body= 'corpo temporário',
    @profile_name= N'wksql01tAdmin',
    @body_format = 'HTML',
    @query_result_separator = ',',
    @query_attachment_filename = 'results.csv',
    @query_no_truncate = '0',
    @attach_query_result_as_file = 1

Problema Observado

Apesar de implementar o código SQL acima, seus resultados ainda estão sendo enviados como codificados em UCS-2 e você mencionou alguns comentários sobre uma correção estar disponível no SQL Server 2005 SP2, mas parece que este não é o caso na sua situação.

A Solução

Embora possa haver opções limitadas para alterar a codificação diretamente através do sp_send_dbmail, você pode contornar esse problema usando a utilidade BCP (Bulk Copy Program).

Usando o BCP para Codificação Adequada

  1. Exportar Dados para um Arquivo Plano: Use o BCP para exportar os resultados de sua consulta para um arquivo plano. O BCP permite que você especifique o formato de codificação durante o processo de exportação.

    bcp "SELECT RTRIM(@string_to_trim), 'tom'" queryout "C:\caminho\para\results.csv" -c -C 65001 -T
    
    • A opção -c indica modo de caractere.
    • A opção -C 65001 especifica a codificação UTF-8.
    • A opção -T usa uma conexão confiável com o SQL Server.
  2. Anexar o Arquivo Plano: Uma vez que o arquivo é gerado com a codificação desejada, você pode então anexar este arquivo ao seu e-mail usando os métodos convencionais. Isso pode ser gerenciado através de um script ou via os trabalhos do SQL Server Agent, onde você pode executar este comando BCP e seguí-lo com sp_send_dbmail para enviar o e-mail.

Resumo dos Passos

  • Execute um comando BCP para despejar os resultados de sua consulta em um arquivo .csv com codificação UTF-8.
  • Use sp_send_dbmail para enviar um e-mail com o anexo .csv.

Conclusão

Embora possa parecer desafiador à primeira vista, resolver o problema de codificação UCS-2 com seus anexos sp_send_dbmail é viável com o uso do BCP. Seguindo os passos descritos acima, você pode garantir que seus anexos sejam codificados corretamente, facilitando o acesso e a utilização das informações fornecidas pelos seus destinatários.

Se você ainda estiver enfrentando problemas ou tiver mais perguntas, sinta-se à vontade para entrar em contato!