Я надеюсь, что этот ответ может помочь другим, кто использует 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';