【问题标题】:How to trigger a SSRS Subscription based on an event?如何根据事件触发 SSRS 订阅?
【发布时间】:2015-05-28 09:20:16
【问题描述】:

有没有一种方法可以在共享文件夹中创建文件之类的事件时触发 SSRS 订阅(基于时间)?我们可以用 powershell 或 C# 来做吗?

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

我使用的是 SQL Server 2008 R2。

【问题讨论】:

    标签: c# sql-server-2008 powershell ssrs-2008-r2


    【解决方案1】:

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

    Firing a Reporting Services Subscription

    您可以使用 FileSystemWatcher 来判断您的文件何时被删除,然后触发订阅。虽然它是异步的,所以如果报告发送成功,您不会收到通知......只是它已成功排队。此外,在触发订阅之前,您首先要修改订阅的参数,因此您必须确保触发订阅的程序不超过一个,否则它可能最终会自己绊倒。

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

    Render Function

    这样您就不必创建虚拟订阅,并且您会立即知道它是否使用正确的参数成功发送。

    最后一点...如果您有企业版(您可能没有),它带有数据驱动报告订阅,您可以使用它来触发订阅:

    Creating a Data-Driven Subscription

    【讨论】:

    • 我有一个 powershell 脚本,它使用渲染函数来获取 XML 文件,以解析与用户名参数关联的计算机名称的 SCCM 报告。尚未失败,看起来坚如磐石且可靠。
    • 布莱恩,非常感谢。这是我一直在寻找的一种解决方案。我使用第一个建议通过 SSIS 触发订阅。
    【解决方案2】:

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

    需要添加SSRS提供的webservice的webservice引用 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());
            }
    

    【讨论】:

      【解决方案3】:

      您可以创建一个使用 FileSystemWatcher (https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher%28v=vs.110%29.aspx) 的 Windows 服务,然后在更改的事件上触发您的工作。

      【讨论】:

      • 谢谢。请问如何触发SSRS作业?
      • 这是什么工作?
      • 这是一个 SSRS 订阅
      猜你喜欢
      • 2022-01-08
      • 2017-08-09
      • 2018-07-25
      • 2022-08-22
      • 2020-03-29
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多