2

매개 변수를 허용하는 SSRS 보고서가 있습니다.이 매개 변수를 기반으로 전자 메일 본문에서 특정 주소로 보고서를 보내야합니다. 수백 개의 다른 주소를 보낼 수 있습니다. 우리는 SQL Server Standard Edition을 사용하고 있습니다. 이를 바탕으로프로그래밍 방식으로 전자 메일 본문에 SSRS 보고서 보내기

, 다음 사실이다 : 우리는 우리는 수백이있을 수 있습니다 (각각의 잠재적받는 사람에 대해 여러 구독을 설정할 수 없습니다

  • (엔터프라이즈 에디션에서만 사용 가능) 구독을 구동 데이터를 사용할 수 없습니다

    • )
    • 우리는 첨부 파일로 보고서를 보내지 않으
    • (나는 우리가 SQL 서버에서 구독을 호출 할 수 있습니다 알고있는 이메일의 본문)

    할 필요가 .Net 코드를 통해 전송할 수 있지만 수신자를 변경할 수는 없습니다. 우리의 최선의 해결책은 적절한 형식으로 SSRS 외부에서 HTML 문자열을 생성하고 이메일 본문에 추가하는 것입니다. 이렇게하면 개발자가 변경해야 할 사항이 있거나 새로운 보고서를 작성해야 할 경우 문자열을 작성해야하므로 HTML에 익숙하지 않은 사용자에게는 매우 유연하지 않습니다.

    SSRS에서 보고서를 만들고 매개 변수 값을 기반으로 지정된 전자 메일 주소로 전자 메일 본문을 보내는 다른 방법이 있습니까?

  • 답변

    3

    짧은 대답은 예이지만 간단하지 않습니다. 다음은 SQL 2008을 위해 개발 한 내용입니다.

    먼저 전자 메일 본문에 보고서를 표시하려면 MHTML 렌더러를 사용하여 보고서를 출력하면됩니다. 이것은 매개 변수화 될 수 있습니다.

    다음으로 보고서를 실행하고 필요한 출력을 생성 할 수있는 스크립트 작업이 필요한 SSIS 패키지가 필요합니다. 여기

    은 SSIS와 함께해야하는 VB 스크립트의 코드 조각입니다 : (. 트롤은 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 패키지 변수를 사용해야합니다

    .

    enter image description here

    은 그 때 나는 필요한 값으로 SSIS 패키지를 호출하는 저장 프로 시저를 만들었습니다. 그런 다음 SQL Server 데이터베이스 메일을 사용하여 SSIS 생성 파일을 수집하고 첨부 한 다음 SSRS 구독의 SMTP 호출이 아닌 dbmail이 처리하는 수신자에게 전달합니다.

    다음은 절차입니다.

    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 보고서를 실행하고 누구에게나 보낼 수 있습니다.그러나 현재의 유연하지 못한 기능에 대한 해결 방법을 얻는 데는 많은 노력과 엔지니어링이 필요합니다.

    마지막으로 위의 절차를 사용하여 전자 메일 주소 데이터를 포함하는 구성 테이블을 반복하는 것이 좋습니다.

    물론 원하는 경우 다른 맞춤형 보고서 매개 변수를이 방법으로 추가 할 수 있습니다.

    +0

    내가 틀렸다고 정정 해 주지만, 보고서를 첨부하고 이메일 본문에 직접 렌더링하지 않습니까? 나는 이미 그렇게 할 수 있었지만, 명시된 바와 같이, 우리는 보고서를 첨부하고 싶지 않습니다. – anothershrubery

    +0

    GetEmailAddresses 및 GetProperty에 대한 코드가 있습니까? 또는 적어도 데이터 (또는 문자열)가 해당 함수를 돌보는 모습을 어떻게 보입니까? –

    +0

    보고서 서버를 설정하지 않고 보고서를 생성 할 수 있습니까? 아니면 렌더링 수단으로 필요합니까? – Utrolig

    관련 문제