пытаясь выяснить, как отправить несколько файловых вложений с помощью sp_send_dbmail - PullRequest
0 голосов
/ 25 марта 2010

MSSQL 2008

Может быть, я просто смотрю не в том месте. Вот сценарий:

У нас есть файлы, хранящиеся в столбце varbinary (max). Я хотел бы выбрать их как отдельные файлы вместе с именами файлов, хранящихся поблизости, как отдельные файловые вложения.

это можно сделать?

достаточно просто отправить результаты запроса в виде вложения, но он просто отправляет 1 файл.

Спасибо

Ответы [ 2 ]

2 голосов
/ 26 марта 2010

На основании документов это не может быть сделано.Вы можете прикрепить несколько файлов, только если они прикреплены из файловой системы (используя @file_attachments=)

Результаты запроса всегда прикрепляются в виде одного файла.

1 голос
/ 21 октября 2015

Я надеюсь, что этот ответ может помочь другим, кто использует sp_send_dbmail для отправки нескольких вложений.У меня есть работа с агентом сервера sql для отправки результата запроса в виде вложения, одна из причин в том, что вложенный текстовый файл сохраняет правильный формат / сетку.Вот сценарий:

IF (SELECT COUNT(itemnumber) FROM tblItems WHERE date = Convert(date,Convert(varchar(8), getdate(), 112))) > 0
-- add this condition so that when there is no query result, say over the weekend, your client won't receive an empty email.
BEGIN

 Declare @currentDate varchar(8), @currentDate2 varchar(10), @filename varchar(100), @subjecttxt varchar(100), @weekdayname varchar(10)
 Set @currentDate = Convert(varchar(8), getdate(), 112)
 Set @currentDate2 = Convert(varchar(10), getdate(), 101)
 Set @weekdayname = datename(dw, @currentDate)
 Set @filename = @currentDate + '.txt'
 Set @subjecttxt = 'Results for ' + @weekdayname + ' ' + @currentDate2    

 EXEC msdb.dbo.sp_send_dbmail
 @profile_name = 'profile_name',
 @recipients = 'test@test.com',
 --@copy_recipients = 'test@test.com',
 @blind_copy_recipients = 'test@test.com',
 @query = 'exec storedprocedure',
 @subject = @subjecttxt,    
 @body = 'mail body.',
 @attach_query_result_as_file = 1,
 @query_attachment_filename = @filename;

END

Через пару месяцев меня попросили добавить вложения к тому же электронному письму, что, по-видимому, не позволяет использовать одно и то же задание агента сервера SQL.Вот моя стратегия в качестве обходного пути.В основном вам нужно добавить дополнительный шаг для запуска sqlcmd и вывода файла.Но этот шаг необходимо выполнить как Операционная система (CmdExec) :

sqlcmd -S SQLServerName -dDatabaseName -E -Q "Stored Procedure Name" -o "C:\myFolder\myFile.txt"

Сначала выполните этот шаг, а затем измените Transact-SQL.Вы также можете запустить sqlcmd как пакетный файл.

IF (SELECT COUNT(itemnumber) FROM tblItems WHERE date = Convert(date,Convert(varchar(8), getdate(), 112))) > 0
-- add this condition so that when there is no query result, say over the weekend, your client won't receive an empty email.
BEGIN

 Declare @currentDate varchar(8), @currentDate2 varchar(10), @filename varchar(100), @subjecttxt varchar(100), @weekdayname varchar(10), @file2 varchar(200)
 Set @currentDate = Convert(varchar(8), getdate(), 112)
 Set @currentDate2 = Convert(varchar(10), getdate(), 101)
 Set @weekdayname = datename(dw, @currentDate)
 Set @filename = @currentDate + '.txt'
 Set @file2 = 'C:\myFolder\myFile.txt'
 Set @subjecttxt = 'Results for ' + @weekdayname + ' ' + @currentDate2    

 EXEC msdb.dbo.sp_send_dbmail
 @profile_name = 'profile_name',
 @recipients = 'test@test.com',
 --@copy_recipients = 'test@test.com',
 @blind_copy_recipients = 'test@test.com',
 @query = 'exec storedprocedure',
 @subject = @subjecttxt,    
 @body = 'mail body.',
 @attach_query_result_as_file = 1,
 @query_attachment_filename = @filename,
 @file_attachments = @file2;

END

Теперь вы можете отправлять несколько вложений, используя исходное задание, которое отправляет только одно вложение.

Обновление: в соответствии с документация , [@file_attachments =] 'file_attachments' Список имен файлов, разделенных точкой с запятой, которые необходимо прикрепить к сообщению электронной почты. Можно добавить несколько вложений, используя точку с запятой для разделения имен файлов.Обратите внимание, что пробел не допускается после точки с запятой, поскольку почта БД будет интерпретировать это как часть имени пути.

EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'profile_name',
        @recipients = 'email@domain.com',
        @subject = 'subject',
        @body = 'body',
        @file_attachments = N'C:\Documents\attachment1.txt;C:\Documents\attachment2.txt';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...