在SQL Server上向维护计划顺序添加条件

我想在SQL Server 2008维护计划中为序列添加一个条件。 此条件基于由T-SQL语句任务设置的variables:

declare @primary bit = 0 select @primary=1 from sys.database_mirroring where mirroring_role = 1 

如何通过优先约束编辑器执行此任务?

我同意SQLChicken。 您将无法通过在SQL Management Studio中创build的简单维护计划来检查variables。 您需要将其编写出来并放入SQL作业或创build一个完整的SSIS包。 SSIS将为您提供通过SSMS提供的所有维护计划任务以及SSIS的所有其他优势,包括可在优先级约束中使用的包variables。

老实说,如果你要进入先进的调整,你最好是脚本解决scheme,然后通过代理安排。 维护计划,虽然很简单的任务,真的有其局限性。

我有一个解决scheme,但它不是优雅的。 这是有效的,但它是一个混乱,它永远不会被认为是一个“最佳做法”。

解决scheme包括使用人为生成的错误来控制stream程,并调整包的属性,以使调用作业的整体错误状况以我们所希望的方式报告成功或失败。

首先,使用条件检查创build一个执行T-SQL语句任务。 从原始问题的例子中,这看起来像这样:

 if not exists (select * from sys.database_mirroring where mirroring_role = 1) begin raiserror('not primary', 16, 1) end 

如果这不是主镜像,则此代码会生成一个错误,如果它是主要的,则不会发生错误。 接下来,创build第二个执行T-SQL语句任务并将其链接到具有成功条件的第一个任务。 如果这不是镜像的主要我们不会去这第二个任务,并且序列将结束。 如果这是主要的,我们将继续进行第二项任务。 第二个任务使用如下代码生成一个虚拟错误:

 raiserror('dummy error', 16, 1) 

现在创build你的第三个任务,并把它连接到第二个失败条件。 在第三项任务中,如果第一项任务的条件为真,那么就做你想做的事情。 这可以是另一个执行T-SQL语句,备份任务,更新统计任务,或其他。 如果条件是错误的,我们将在第一个任务之后离开序列。 如果条件成立,我们将通过虚拟错误继续前进到第三个任务,这实际上是我们要完成的工作。

任务2中的虚拟错误的原因是为了使调用工作的最终错误状态报告我们想要的,还有一些其他的软件包属性,我们也需要调整,以使其工作。 转到属性窗口(如果它没有打开,请从任何一个任务的右键菜单中打开它),然后点击顶部的下拉菜单。 这列出了您可以更改属性的所有维护计划元素。 单击Subplan_1序列,其中Subplan_1是您正在使用的子计划的名称。将FailParentOnFailure更改为False。 当我们在任务1中产生条件错误或者在任务2中产生虚拟错误时,这将保持调用作业不报告错误。接下来,进入MyPackage包的属性,其中MyPackage是你正在工作的包的名称。 MaximumErrorCount为2.这将导致调用作业报告成功时,只有一个由任务2中的虚拟错误产生的错误,但报告失败,如果第三个任务也产生错误。 如果生成的唯一错误是通过任务1中的条件检查,它也会报告成功。

就是这样,我希望有人认为这有用。

对我来说,在SQL实例上不安装Information Services的条件维护计划最简单的方法就是使用SQL Server数据工具( SSDT ):

  1. 从这里下载SSDT的安装(它是免费的): https : //docs.microsoft.com/en-us/sql/ssdt/download-sql-server-data-tools-ssdt
  2. 创build一个新的SSIS项目。 新项目的其中一个文件是Package.dtsx它是一个XML文件。
  3. 使用以下查询从您的数据库中为您的维护计划selectXML:
 SELECT id, name, description, CAST(CAST(packagedata AS varbinary(MAX)) AS varchar(MAX)) xml_str FROM msdb.dbo.sysssispackages with(nolock) WHERE name='your maintenance plan name'; 
  1. 将xml_str列值复制粘贴到您创build的SSIS项目的Package.dtsx文件中。
  2. 添加variables并添加“ 执行SQL任务 ”节点。 “执行SQL任务”允许您检索具有SQL Server维护计划所具有的与“执行T-SQL语句任务”不同的select到variables中的数据。 一旦插入到SQL维护计划中,“执行SQL任务”将GUI直接编辑到没有SSDT的SSMS中。 但是variables只能用SSDT或直接修改维护计划的XML的SQL来添加和编辑。 不要忘记保存。
  3. Package.dtsx文件中的XML作为文本复制到剪贴板中,并使用SQL命令更新msdb.dbo.sysssispackages表的维护计划packagedata字段。 现在,如果你打开SSMS的维护计划,你会发现添加的“执行SQL任务”有一个GUI,甚至可以从SSMS完美configuration。
  4. 在执行SQL任务后,将所需的信息收集到variables中,然后用expression式创build约束/链接。 约束/链接必须连接有条件执行的节点。 这些expression式将指示stream遵循哪个约束/链接,哪个不是。 expression式正在利用条件的variables数据。 这可以通过SSMS GUI进行,无需额外的工具。

当然,如果您确切知道必须为variables修改哪些XML以及将“执行SQL任务”修改为目标维护计划的包数据XML,那么不使用SSDT,只能使用纯更新SQL命令。 一旦插入到一个维护计划中,可以通过SSMS GUI将“执行SQL任务”节点复制并粘贴到其他维护计划中,而无需额外的工具。 不幸的是,variables不是这种情况。