Отправить отчет SSRS по электронной почте

У меня есть отчет SSRS, который принимает параметр, основанный на этом параметре, отчет должен быть отправлен в орган электронной почты по определенному адресу. Могут быть сотни разных адресов, на которые они могут быть отправлены. Мы используем SQL Server Standard Edition.

Исходя из этого, верно следующее:

  • Мы не можем использовать подписки, основанные на данных (доступно только в Enterprise edition)
  • Мы не можем настроить несколько подписчиков для каждого потенциального получателя (могут быть сотни)
  • Мы не хотим отправлять отчет в виде вложения (необходимо, чтобы он был телом электронной почты)

Я знаю, что мы можем вызывать подписку с SQL Server или через .Net-код, но мы не можем изменить получателя, насколько я могу видеть. Наше лучшее решение на минуту – создать строку HTML, вне SSRS, с соответствующим форматированием и добавить это в тело письма. При этом это означает, что разработчик должен быть под рукой, чтобы создать строку, если что-то нужно изменить, или если нужен новый отчет, поэтому он не очень гибкий для всех, кто не знаком с HTML.

Итак, есть ли другой способ создать отчет в SSRS и отправить его в тело письма на указанный адрес электронной почты на основе значения параметра?

Короткий ответ – да, но это не просто. Вот что я разработал для 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 и отправки его кому бы то ни было. Но для достижения обходного пути к текущим негибким функциональным функциям очень сложно и над разработкой.

Наконец, я бы рекомендовал повторить обработку таблицы конфигурации, содержащей данные адреса электронной почты и т. Д., Используя описанную выше процедуру.

Конечно, с помощью этого подхода можно добавить и другие параметры отчета.

  • Отладка отчета не работает, показывая сообщение об ошибке «Убедитесь, что предоставлены достаточные разрешения» Как решить эту проблему?
  • Какие учетные данные необходимо передавать при доступе к отчету SSRS через URL-адрес?
  • Преобразовать MonthName в месяц Номер SSRS
  • Сброс параметров SSRS при изменении параметра даты
  • Как перемещать столбцы деталей между родительскими группами в SSRS
  • Почему мои диаграммы не отображаются в SSRS 2012?
  • Несколько гипер-ссылок в одной ячейке в отчете SSRS
  • Параметры URL-адреса служб отчетов SQL Server не работают
  • Записи SSRS не отображаются, когда используется (выберите все), но при выборе особого значения
  • Выражение для удаления возврата каретки в SSRS
  • SQL - объединение последовательных строк даты на основе столбца
  • Interesting Posts

    Репликация SQL «Процесс не мог подключиться к подписчику»

    «Неправильный синтаксис рядом с ключевым словом« WHERE »в SQL Server из статьи

    Как удалить пробелы в столбце строки

    Запрос SQL Server, делающий нулевой контроль

    Генерация идентификатора Hibernate с Oracle SEQUENCES и SQL-Server IDENTITIES

    Reporting Services – ссылка модели отчета (SDML) на представление источника данных (DSV)

    Какие данные могут быть сохранены в varbinary data type SQL Server?

    Что означает DBMSSOCN?

    проблемы взаимоблокировки с триггерами

    Любопытное противоречивое поведение SQL Server в окклюженных функциях?

    Сохраненная процедура и выберите один из двух почти одинаковых видов

    Хотите написать этот запрос SQL Server без использования "не в"

    Является ли Amazon SQS хорошим инструментом для обработки данных регистрации данных в базе данных?

    Excel 2010 VBA adodb подключение к SQL Server 2010 время ожидания

    Как заказать по фамилии в столбце полного имени?

    Давайте будем гением компьютера.