짧은 대답은 예이지만 간단하지 않습니다. 다음은 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 패키지 변수를 사용해야합니다
.
은 그 때 나는 필요한 값으로 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 보고서를 실행하고 누구에게나 보낼 수 있습니다.그러나 현재의 유연하지 못한 기능에 대한 해결 방법을 얻는 데는 많은 노력과 엔지니어링이 필요합니다.
마지막으로 위의 절차를 사용하여 전자 메일 주소 데이터를 포함하는 구성 테이블을 반복하는 것이 좋습니다.
물론 원하는 경우 다른 맞춤형 보고서 매개 변수를이 방법으로 추가 할 수 있습니다.
내가 틀렸다고 정정 해 주지만, 보고서를 첨부하고 이메일 본문에 직접 렌더링하지 않습니까? 나는 이미 그렇게 할 수 있었지만, 명시된 바와 같이, 우리는 보고서를 첨부하고 싶지 않습니다. – anothershrubery
GetEmailAddresses 및 GetProperty에 대한 코드가 있습니까? 또는 적어도 데이터 (또는 문자열)가 해당 함수를 돌보는 모습을 어떻게 보입니까? –
보고서 서버를 설정하지 않고 보고서를 생성 할 수 있습니까? 아니면 렌더링 수단으로 필요합니까? – Utrolig