Как изменить кодировку запрошенного вложения sp_send_dbmail?

Я использую sp_send_dbmail для создания и отправки файлов, которые передаются другой программе. Программа переваривает кодировку "ANSI/ASCII" и "ISO-8859-1". Но я не могу заставить sp_send_dbmail сделать его.

Вызов процедуры выглядит так

exec msdb.dbo.sp_send_dbmail 
    @profile_name= @profile_name, 
    @recipients  = @recipients,
    @body = @body,
    @subject = @subject,
    @attach_query_result_as_file = 1, 
    @query_result_header = 0,
    @query_result_no_padding = 1,
    @query = @query,
    @query_attachment_filename = @fname,
    @query_result_width = 4000,
    @mailitem_id = @mailitem_id OUTPUT

Таким образом, вложение создается из результатов переданного запроса. Но результирующий файл, который на самом деле прикрепляется к почте, почему-то имеет кодировку UCS2 Little Endian. Есть ли способ изменить это?


person Paul Kyrejto    schedule 10.04.2013    source источник


Ответы (1)


Найден обходной путь, позволяющий переключаться между UTF/ANSI. Для этого вам нужно изменить sp_send_dbmail следующим образом:

  1. Добавьте новый параметр в процедуру что-то вроде @ANSI_Attachment BIT = 0
  2. Замените часть его кода IF(@AttachmentsExist = 1) BEGIN ....... END на

`ЕСЛИ (@AttachmentsExist = 1)

BEGIN
    if (@ANSI_Attachment = 1) 
    begin
        --Copy temp attachments to sysmail_attachments      
        INSERT INTO sysmail_attachments(mailitem_id, filename, filesize, attachment)
        SELECT @mailitem_id, filename, filesize, 
                convert(varbinary(max), 
                    substring( -- remove BOM mark from unicode
                        convert(varchar(max), CONVERT (nvarchar(max), attachment)), 
                        2, DATALENGTH(attachment)/2
                    )
                )
        FROM sysmail_attachments_transfer
        WHERE uid = @temp_table_uid
    end else begin
        --Copy temp attachments to sysmail_attachments      
        INSERT INTO sysmail_attachments(mailitem_id, filename, filesize, attachment)
        SELECT @mailitem_id, filename, filesize, attachment
        FROM sysmail_attachments_transfer
        WHERE uid = @temp_table_uid
    end
END `

Это делает то же самое, но если в вызове процедуры используется @ANSI_Attachment = 1, он удаляет метку Unicode BOM перед отправкой.

Подсмотрел это решение здесь

person Paul Kyrejto    schedule 10.04.2013