Отправить отчет SSRS по электронной почте
У меня есть отчет SSRS, который принимает параметр, основанный на этом параметре, отчет должен быть отправлен в орган электронной почты по определенному адресу. Могут быть сотни разных адресов, на которые они могут быть отправлены. Мы используем SQL Server Standard Edition.
Исходя из этого, верно следующее:
- Мы не можем использовать подписки, основанные на данных (доступно только в Enterprise edition)
- Мы не можем настроить несколько подписчиков для каждого потенциального получателя (могут быть сотни)
- Мы не хотим отправлять отчет в виде вложения (необходимо, чтобы он был телом электронной почты)
Я знаю, что мы можем вызывать подписку с SQL Server или через .Net-код, но мы не можем изменить получателя, насколько я могу видеть. Наше лучшее решение на минуту – создать строку HTML, вне SSRS, с соответствующим форматированием и добавить это в тело письма. При этом это означает, что разработчик должен быть под рукой, чтобы создать строку, если что-то нужно изменить, или если нужен новый отчет, поэтому он не очень гибкий для всех, кто не знаком с HTML.
- Рассчитанная серия SSRS вместе с регулярной серией
- Как я могу отобразить зеленую ячейку, если результат верен или изображение зеленого робота, когда результат верен в службах отчетов SQL Server
- Создатель отчетов SSRS, как скрыть конкретное текстовое поле, экспортирующее в Excel
- Подводный отчет не может быть показан. Под-отчет работает отдельно - не с основным докладом
- Создайте набор данных SSRS, который запрашивает данные, зависящие от результатов из хранимой процедуры, которая создает таблицу Temp для хранения результатов?
Итак, есть ли другой способ создать отчет в SSRS и отправить его в тело письма на указанный адрес электронной почты на основе значения параметра?
- Несколько отчетов в SSRS с использованием той же хранимой процедуры
- СОЮЗУ или НЕ СОЮЗУ
- SSRS - повторное использование временной таблицы в нескольких наборах данных
- SSRS Subreport выполняется несколько раз, я хочу, чтобы он выполнялся один раз
- Конструктор отчетов SSRS 2012 не запускается с удаленного хоста - 401 Несанкционированный
- Диспетчер отчетов SSRS + выглядит странно
- Отобразить имя столбца SQL как значение строки в SSRS-матрице
- Как настроить SQL Azure Reporting?
Короткий ответ – да, но это не просто. Вот что я разработал для SQL 2008.
Во-первых, чтобы отчет появился в теле письма, вам просто нужно его вывести с помощью средства визуализации MHTML. Это также можно параметризовать.
Затем вам понадобится пакет SSIS с задачей сценария, которая может запускать отчет и выводить требуемый результат.
Вот фрагмент сценария VB, который вам понадобится в SSIS:
(Тролли прощают меня за использование VB. Я бы использовал только C # в эти дни)
Первый способ сохранения файла.
Protected Sub SaveFile(ByVal url As String, ByVal localpath As String) Dim loRequest As System.Net.HttpWebRequest Dim loResponse As System.Net.HttpWebResponse Dim loResponseStream As System.IO.Stream Dim loFileStream As New System.IO.FileStream(localpath, System.IO.FileMode.Create, System.IO.FileAccess.Write) Dim laBytes(256) As Byte Dim liCount As Integer = 1 Try loRequest = CType(System.Net.WebRequest.Create(url), System.Net.HttpWebRequest) loRequest.Credentials = System.Net.CredentialCache.DefaultCredentials loRequest.Timeout = 99999 '1 minute loRequest.Method = "GET" loResponse = CType(loRequest.GetResponse, System.Net.HttpWebResponse) loResponseStream = loResponse.GetResponseStream Do While liCount > 0 liCount = loResponseStream.Read(laBytes, 0, 256) loFileStream.Write(laBytes, 0, liCount) Loop loFileStream.Flush() loFileStream.Close() Catch ex As Exception End Try End Sub
Второй метод для вызова отчета SSRS в требуемом формате и сохранения с использованием первого метода.
Public Sub Main() Dim url, destination As String Dim FileExtension As String Dim RenderAs As String 'default to avoid nulls FileExtension = ".NULL" 'http://msdn.microsoft.com/en-gb/library/ms154606.aspx RenderAs = Dts.Variables("FileType").Value.ToString If RenderAs = "EXCEL" Then FileExtension = ".xls" ElseIf RenderAs = "WORD" Then FileExtension = ".doc" ElseIf RenderAs = "PDF" Then FileExtension = ".pdf" ElseIf RenderAs = "MHTML" Then FileExtension = ".mhtml" ElseIf RenderAs = "CSV" Then FileExtension = ".csv" ElseIf RenderAs = "IMAGE" Then FileExtension = ".tif" End If 'create ssrs url 'url = "http://hisrs01/ReportServer/Pages/ReportViewer.aspx?%2fCombined+Reports+-+HIS%2f14-15+SSoTP+Staff+Level+Weekly+Activity&rs:Command=Render&StaffGroup=" + Dts.Variables("varRSParameter1").Value.ToString + "&Provider=" + Dts.Variables("varRSParameter2").Value.ToString + "&rs:Format=Excel" url = Dts.Variables("ReportURL").Value.ToString + "&rs:Format=" + Dts.Variables("FileType").Value.ToString 'create destination destination = Dts.Variables("TempFilePath").Value.ToString + "\Reports Created\" + Dts.Variables("FileName").Value.ToString + FileExtension 'System.Threading.Thread.Sleep(5000) 'write url out to test file (debugging) 'strFile = "D:\Test\" + Replace(Dts.Variables("varRSParameter1").Value.ToString, "+", " ") + " - " + Replace(Dts.Variables("varRSParameter2").Value.ToString, "+", " ") + ".txt" 'File.AppendAllText(strFile, url) SaveFile(url, destination) Dts.TaskResult = ScriptResults.Success End Sub
Вам нужно будет использовать переменные пакета SSIS для обработки того, как создается отчет, в каком формате и откуда.
Затем я создал хранимую процедуру для вызова пакета SSIS с необходимыми значениями. Затем он использовал почту базы данных SQL Server для сбора созданного файла SSIS, приложил его и отправил с получателями, обработанными dbmail, а не SMTP-вызовом из подписки SSRS.
Вот процедура.
CREATE PROCEDURE [dbo].[EmailSSRSReport] ( @Event VARCHAR(50) = 'Test', @ReportURL NVARCHAR(500), @FileType VARCHAR(10) = 'MHTML', @FileName VARCHAR(100) = 'Rendered SSRS Report', @Debug BIT = 0 ) AS BEGIN --local variables DECLARE @Cmd NVARCHAR(500) DECLARE @EmailAddresses NVARCHAR(500) DECLARE @PackagePath NVARCHAR(255) DECLARE @FullFilePath NVARCHAR(500) DECLARE @FinalBodyText VARCHAR(MAX) DECLARE @FinalSubject VARCHAR(MAX) DECLARE @CmdOutput TABLE ( [Output] NVARCHAR(500) NULL ) --set and get parts for report and email SELECT @EmailAddresses = [Notifications].[dbo].[fn_GetEmailAddresses](@Event), @PackagePath = [dbo].[fn_GetProperty]('SSISPackageLocation'), @FullFilePath = [dbo].[fn_GetProperty]('ReportsOutputFolder') + @FileName + CASE UPPER(@FileType) WHEN 'EXCEL' THEN '.xls' WHEN 'WORD' THEN '.doc' WHEN 'PDF' THEN '.pdf' WHEN 'MHTML' THEN '.mhtml' WHEN 'CSV' THEN '.csv' WHEN 'IMAGE' THEN '.tif' END, @FinalBodyText = 'Please see attached the requested SSRS report <strong>' + @FileName + '</strong>.<br/><br/>Kind regards<br/><br/>S&SHIS Data Management<br/><a href="mailto:[email protected]?subject=SSRS Report Auto Email">[email protected]</a>', @FinalSubject = 'Auto Alert For ' + @FileName + '. ' + CONVERT(VARCHAR, GETDATE(), 103) SET @Cmd = 'dtexec /f "' + @PackagePath + 'Run SSRS Report.dtsx" /set \package.variables[ReportURL].Value;"' + @ReportURL + '" /set \package.variables[FileName].Value;"' + @FileName + '" /set \package.variables[FileType].Value;"' + @FileType + '"' --add styling SET @FinalBodyText = ' <html> <head> <style type="text/css"> body { font-family: "calibri"; font-size: 16px; } </style> </head> <body> ' + @FinalBodyText + '</body> </html>' --run command to produce SSRS report with params INSERT INTO @CmdOutput EXEC [master].sys.xp_cmdshell @Cmd --check cmd output for errors IF EXISTS ( SELECT * FROM @CmdOutput WHERE [Output] LIKE '%error%' ) BEGIN RAISERROR('Error executing command, run procedure in debug mode o view output.',16,1) RETURN; END --output details in debug mode IF @Debug = 1 BEGIN SELECT @Cmd AS 'Cmd' SELECT * FROM @CmdOutput END --send email EXEC msdb.dbo.sp_send_dbmail @recipients = @EmailAddresses, @subject = @FinalSubject, @body = @FinalBodyText, @file_attachments = @FullFilePath, @body_format = 'HTML'; END GO
Это дает вам полный гибкий способ запуска любого отчета SSRS и отправки его кому бы то ни было. Но для достижения обходного пути к текущим негибким функциональным функциям очень сложно и над разработкой.
Наконец, я бы рекомендовал повторить обработку таблицы конфигурации, содержащей данные адреса электронной почты и т. Д., Используя описанную выше процедуру.
Конечно, с помощью этого подхода можно добавить и другие параметры отчета.