SSRS 和 PowerShell:创建和设置报告计划?

SSRS & PowerShell: Create and set schedule for reports?

有没有一种方法可以在 SSRS 上单击一次创建然后更改文件夹中所有报告的计划?我有很多报告,我不知道有什么办法,但一个一个地做。

========================================

编辑:2018 年 8 月 30 日

我在创建时间表时遇到了一些问题(然后我仍然需要将其设置为所有报告):

$ScheduleDefinition = New-Object SSRS.ScheduleDefinition
$ScheduleDefinition.StartDateTime = [DateTime] "01/01/2018 12:00:00 AM"
$ScheduleDefinition.EndDate = [DateTime] "01/01/2050 12:00:00 AM"
$ScheduleDefinition.EndDateSpecified = "True"

$CreateSchedule = $ReportServerProxy.CreateSchedule("Report Schedule",$ScheduleDefinition,$null)

结果:

Cannot convert argument "ScheduleDefinition", with value: "SSRS.ScheduleDefinition", for "CreateSchedule" to type "SSRS.ScheduleDefinition": "Cannot convert the "SSRS.ScheduleDefinition" value of type "SSRS.ScheduleDefinition" to type "SSRS.ScheduleDefinition"."

我是如何建立联系的:

$ReportServerUri = "http://localhost/reportserver/ReportService2010.asmx?wsdl"
$ReportServerProxy = New-WebServiceProxy -Uri $ReportServerUri -UseDefaultCredential -Namespace "SSRS"

如果 powershell 不是您要求的限制条件,我建议您通过以下步骤使用 SSIS:

  1. 使用此 link 中解释的方法设置您希望安排的所有报告集: http://www.sqlservercentral.com/articles/Integration+Services+(SSIS)/93504/

  2. 然后您可以使用 SQL 服务器代理作业安排此 SSIS 程序包(在步骤#1 中创建)。您可以参考下面 link 关于通过 SQL 服务器代理作业调度 SSIS 包 https://www.mssqltips.com/sqlservertutorial/220/scheduling-ssis-packages-with-sql-server-agent/

  3. 然后通过使用存储过程:sp_update_schedule,您可以在任何时间更改 Sql 服务器代理作业计划来自您的 UI 的单个 clink 或根据您的需要执行此过程。详情见下文 link。

https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-update-schedule-transact-sql?view=sql-server-2017

下面是可以满足您要求的另一种选择。

  1. 使用此 link 中解释的方法设置您希望安排的所有报告集:http://www.bi-rootdata.com/2018/08/execute-ssrs-subscription-on-demand.html
  2. 然后您可以使用 SQL 服务器代理作业安排批处理文件(在步骤#1 中创建)。您可以参考下面 link 关于通过 SQL 服务器代理作业 https://sharminjahan625.wordpress.com/2013/08/30/384/
  3. 调度批处理文件
  4. 然后通过使用存储过程:sp_update_schedule,您可以随时更改 Sql 服务器代理作业计划在单个 clink 上从您的 UI或根据您的需要执行此过程。有关详细信息,请参阅下文 link。 https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-update-schedule-transact-sql?view=sql-server-2017

目前这是一条较长的评论,但我认为这可能会有所帮助。

我有一个旧版本的 SSRS 2008,并且有一个不相关的(与此答案相关的)PowerShell 模块供我使用。我提到这一点是因为当我创建 SSRS 对象时,我引用了我的连接代理对象的名称空间。如果我不这样做,我会收到类型不匹配错误 类似于 您遇到的错误。

# Get the namespace
$ssrsServiceNamespace = $connectservice.GetType().namespace

# Create the schedule definition
$ScheduleDefinition = New-Object "$ssrsServiceNamespace.ScheduleDefinition"
$ScheduleDefinition.StartDateTime = [DateTime] "01/01/2018 12:00:00 AM"
$ScheduleDefinition.EndDate = [DateTime] "01/01/2050 12:00:00 AM"
$ScheduleDefinition.EndDateSpecified = "True"

# Add it to SSRS
$connectservice.CreateSchedule("test report schedule",$ScheduleDefinition)

哪个结果是GUID?为了我。大概是为了新的时间表实体。

有一个新的 Powershell Module 可以在报表服务器上自动执行任务。

查看 Cmdlet Set-RsSubscription 和 New-RsScheduleXml。

创建计划

您可以使用 CreateSchedule 功能创建共享日程:

$svcUrl = 'http://your-server-name/ReportServer/reportservice2010.asmx'
$svc = New-WebServiceProxy -Class 'RS' -Namespace 'RS' -Uri $svcUrl -UseDefaultCredential

$definition = New-Object RS.ScheduleDefinition  
$scheduleID = ""
$definition.StartDateTime =  [DateTime] "01/01/2018 12:00:00 AM"
$recurrence = New-Object RS.DailyRecurrence
$recurrence.DaysInterval = 1
$definition.Item = $recurrence

$scheduleID = $svc.CreateSchedule("My Schedule",$definition, $null);

为文件夹中的所有报告设置历史快照计划

然后您可以首先使用 ListChildren function. Then for each report, you can use SetItemHistoryOptions 获取所有报告,以使用您在上一步中创建的共享计划设置历史快照计划:

$sharedSchedule = New-Object RS.ScheduleReference
$sharedSchedule.ScheduleID = $scheduleID 
$reports = $svc.ListChildren("/", $true) | Where-Object { $_.TypeName -eq "Report" }
foreach ($report in $reports) {
    $svc.SetItemHistoryOptions($report.Path, $true, $true, $sharedSchedule)
}