Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Отправка файла по почте.  [new]
ISergey
Member

Откуда:
Сообщений: 182
Здрасвуйте.
При отправке письма процедурой msdb.dbo.sp_send_dbmail, не получается получить на выходе файл "один-в-один".
Файл хранится в поле varbinary(MAX).
Параметры:
@attach_query_result_as_file = 1,
@query_result_header = 0,
@query_no_truncate = 1,
@query_attachment_filename = @FileName,
@query = <запрос>

Запрос:
'SET NOCOUNT ON;SELECT ColumnBin FROM dbo.TestBin;'
помещает данные в файл in hexadecimal format.
А преобразование типа:
SELECT CONVERT(nvarchar(MAX), ColumnBin)
не дает желаемого результата.

Подскажите плиз правильный запрос.

P.S. Данные в поле могут быть какого угодно формата: XLS, DOC, XML, JPG и т.д. Т.е. перед SQL Server стоит задача: отправить по почте "вот этот самый файл" ...
22 сен 09, 15:20    [7693162]     Ответить | Цитировать Сообщить модератору
 Re: Отправка файла по почте.  [new]
Glory
Member

Откуда:
Сообщений: 104760
ISergey


Запрос:
'SET NOCOUNT ON;SELECT ColumnBin FROM dbo.TestBin;'
помещает данные в файл in hexadecimal format.

А вы в каком хотите увидеть тип varbinary ?
22 сен 09, 15:22    [7693186]     Ответить | Цитировать Сообщить модератору
 Re: Отправка файла по почте.  [new]
ISergey
Member

Откуда:
Сообщений: 182
Сп. за оперативность...
Проблема в том что запрос 'SET NOCOUNT ON;SELECT ColumnBin FROM dbo.TestBin;' преобразует бинарные данные в HEX-код. И на выходе имею не двоичный файл, а текстовый с HEX-символами ...
22 сен 09, 15:29    [7693258]     Ответить | Цитировать Сообщить модератору
 Re: Отправка файла по почте.  [new]
Glory
Member

Откуда:
Сообщений: 104760
BOL - sp_send_dbmail

When a query is specified, the result set is formatted as inline text. Binary data in the result is sent in hexadecimal format.

Придется импортировать данные в файл самому
22 сен 09, 15:55    [7693487]     Ответить | Цитировать Сообщить модератору
 Re: Отправка файла по почте.  [new]
ISergey
Member

Откуда:
Сообщений: 182
Glory
BOL - sp_send_dbmail

When a query is specified, the result set is formatted as inline text. Binary data in the result is sent in hexadecimal format.

Придется импортировать данные в файл самому


1. Сначала сохранить бинарник на диске при помощи sp_OA
2. Приаттачить полученный файл к письму.
Так?
22 сен 09, 15:58    [7693512]     Ответить | Цитировать Сообщить модератору
 Re: Отправка файла по почте.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Для sp_OA нужно много прав. Предпочтительнее выглядит своя CLR функция
22 сен 09, 16:40    [7693925]     Ответить | Цитировать Сообщить модератору
 Re: Отправка файла по почте.  [new]
ISergey
Member

Откуда:
Сообщений: 182
Опередили с ответом ...
Я тоже пришел к этому решению.

Но все-равно получается через загогулину...
22 сен 09, 18:10    [7694634]     Ответить | Цитировать Сообщить модератору
 Re: Отправка файла по почте.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Glory
BOL - sp_send_dbmail
When a query is specified, the result set is formatted as inline text. Binary data in the result is sent in hexadecimal format.
Зря они так, могли бы добавить один опциональный параметр типа VarBinary(max), итак вон @query типа nvarchar(max).
22 сен 09, 21:31    [7695160]     Ответить | Цитировать Сообщить модератору
 Re: Отправка файла по почте.  [new]
ISergey
Member

Откуда:
Сообщений: 182
Чтоб тема не повисла в воздухе, вот код на C#:
using System;
using System.Data.SqlTypes;
using System.IO;

public partial class StoredProcedures {
  [Microsoft.SqlServer.Server.SqlProcedure]
  public static void sys_SaveToFile(SqlString Path, SqlString FileName, SqlBinary FileData) {
    // сохраняем двоичные данные в файл на диске
    FileStream fs = new FileStream(Path.ToString() + FileName.ToString(), FileMode.Create);
    BinaryWriter bw = new BinaryWriter(fs);
    bw.Write(FileData.Value, 0, FileData.Length);
    bw.Close();
    fs.Close();
  }
}
Осталось дополнить его всякими проверками и возвратом True/False. Не забываем в свойствах проекта добавить сертификат, раз работаем с файловой системой. Регистрируем сборку и процедуру.

Вызов на сервере будет таким:
DECLARE @result varchar(255), @TempPath nvarchar(2000),
        @FileName nvarchar(255), @DataBin varbinary(MAX), @FullName nvarchar(2000)

  -- сохраним вложение во внешний файл
  SELECT @FileName = ???,
         @DataBin = ???,
         @TempPath = ???
  --
  EXEC dbo.sys_SaveToFile @TempPath, @FileName, @DataBin
  -- отправим письмо
  SET @FullName = @TempPath + @FileName
  --
  EXEC @result = msdb.dbo.sp_send_dbmail 
    @profile_name = '???',
    @recipients = '???',
    @subject = '???',
    @body = '???',
    @body_format = 'TEXT',
    @file_attachments = @FullName
  SELECT result = CASE WHEN (@result = 0) THEN 'OK' ELSE 'ERR' END

Свем спасибо ...
23 сен 09, 13:38    [7697455]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить