如何基于事件触发 SSRS 订阅?

8

当共享文件夹中创建文件时,是否有一种方法可以触发基于时间的SSRS订阅?我们可以使用PowerShell或C#吗?

在SSRS中是否有开箱即用的功能可用(尽管我认为没有)?

我正在使用SQL Server 2008 R2。

3个回答

6

是的,我们在这里做类似的事情。您可以使用Reporting Services Web服务的FireSubscription函数触发订阅。以下是如何设置的详细说明:

触发Reporting Services订阅

您可以使用FileSystemWatcher来告诉您何时放置了文件,然后再触发订阅。虽然它是异步的,所以如果报告成功发送,您不会收到通知...只有它已经成功排队的通知。此外,在触发之前,您首先需要修改订阅的参数,因此必须确保您没有多个程序触发订阅,否则可能会出现错误。

另一种稍微复杂的方法是使用Render函数生成报告,然后让您的程序管理电子邮件。

Render函数

这样,您就不必创建虚拟订阅,而且可以立即知道是否成功发送了正确的参数。
最后需要注意的是...如果您有企业版(可能没有),它带有数据驱动的报告订阅,您可以使用它来触发订阅: 创建数据驱动的订阅

我有一个PowerShell脚本,使用render函数获取XML文件以解析与用户名参数关联的计算机名称的SCCM报告。它从未失败过,似乎非常稳定可靠。 - ATek
Brian,非常感谢。这正是我一直在寻找的解决方案。我使用了第一个建议通过SSIS触发订阅。 - AJ01

2

我在这里使用了及时订阅,因为我需要在某个按钮点击后生成报告,所以我创建了一个订阅,在一分钟后触发并生成PDF报告。我从这篇文章中得到了所有的帮助:http://odetocode.com/articles/114.aspx

您需要添加SSRS提供的Web服务引用http://mymachine/ReportServer/ReportService2010.asmx

这里的@"\MyMachineName\Share"是我的PDF存储路径 (PATH:报告保存的文件夹路径或UNC文件共享路径。https://msdn.microsoft.com/en-us/library/ms154020.aspx)

因此,您可以根据需要在创建文件时调用生成订阅。

        using Test_WebProject.ReportService2010;
        private static ExtensionSettings GetExtensionSettings()
        {
            ParameterValue[] extensionParams = new ParameterValue[7];

            for (int i = 0; i < extensionParams.Length; i++)
                extensionParams[i] = new ParameterValue();

            extensionParams[0].Name = "FILENAME";
            extensionParams[0].Value = "Test1@TimeStamp";

            extensionParams[1].Name = "FILEEXTN";
            extensionParams[1].Value = "true";

            extensionParams[2].Name = "PATH";
            extensionParams[2].Value = @"\\MyMachineName\Share";

            extensionParams[3].Name = "RENDER_FORMAT";
            extensionParams[3].Value = "PDF";

            extensionParams[4].Name = "WRITEMODE";
            extensionParams[4].Value = "None"; //"Overwrite ";// "AutoIncrement";

            extensionParams[5].Name = "USERNAME";
            extensionParams[5].Value = "gmd";

            extensionParams[6].Name = "PASSWORD";
            extensionParams[6].Value = "password123";

            ExtensionSettings extensionSettings = new ExtensionSettings();
            extensionSettings.Extension = "Report Server FileShare"; // EXTENSION_FILESHARE;
            extensionSettings.ParameterValues = extensionParams;

            return extensionSettings;
        }
        static void generateSubscription()
        {
            string report = @"/MyReports/TestSSRSSubscrptionReport"; 

            string description = "My Test subscription2010";
            string eventType = "TimedSubscription";

            ExtensionSettings extSettings = GetExtensionSettings();


            List<ReportService2010.ParameterValue> parameters = new List<ReportService2010.ParameterValue>();            
            parameters.Add(new ReportService2010.ParameterValue() { Name = "EmployeeKey", Value = "9" });
            parameters.Add(new ReportService2010.ParameterValue() { Name = "SelectedColumn", Value = "EmployeeKey" });

            parameters.Add(new ReportService2010.ParameterValue() { Name = "ParamSelectedColumns", Value = "FirstName" });
            parameters.Add(new ReportService2010.ParameterValue() { Name = "ParamSelectedColumns", Value = "LastName" });

            NetworkCredential credentials = new NetworkCredential("gmd", "password123");
            ReportService2010.ReportingService2010 rs = new ReportService2010.ReportingService2010();
            rs.Credentials = credentials; // System.Net.CredentialCache.DefaultCredentials;

            DateTime topDatetime = DateTime.Now;
            topDatetime = topDatetime.AddMinutes(1);
            string scheduleXml = "<ScheduleDefinition><StartDateTime>";
            scheduleXml += topDatetime.ToShortDateString() + " " + topDatetime.ToShortTimeString();
            scheduleXml += "</StartDateTime></ScheduleDefinition>";

            string sid = rs.CreateSubscription(report, extSettings, description, eventType, scheduleXml, parameters.ToArray());
        }

0

谢谢。我可以问一下如何触发SSRS作业吗? - AJ01
这是什么样的工作? - solidau
这是一个SSRS订阅。 - AJ01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接