我想在我的 SQL Server 2008 维护计划中为序列添加条件。此条件基于 T-SQL 语句任务设置的变量:
declare @primary bit = 0
select @primary=1
from sys.database_mirroring
where mirroring_role = 1
如何通过优先约束编辑器执行此任务?
我想在我的 SQL Server 2008 维护计划中为序列添加条件。此条件基于 T-SQL 语句任务设置的变量:
declare @primary bit = 0
select @primary=1
from sys.database_mirroring
where mirroring_role = 1
如何通过优先约束编辑器执行此任务?
老实说,如果您要进行这样的高级调整,最好编写解决方案的脚本,然后通过代理对其进行调度。维护计划虽然适用于非常简单的任务,但确实有其局限性。
我同意 SQLChicken。您将无法通过在 SQL Management Studio 中创建的简单维护计划来检查变量。您需要编写脚本并将其放入 SQL 作业中,或者创建一个完整的 SSIS 包。SSIS 将为您提供可通过 SSMS 获得的所有维护计划任务以及 SSIS 的所有其他好处,包括您可以在优先约束中使用的包变量。
我对此有一个解决方案,但它并不优雅。这行得通,但它是一个杂物,永远不会被认为是“最佳实践”。
该解决方案涉及使用人工生成的错误来控制流程,并调整包属性,以便调用作业的整体错误条件以我们想要的方式报告成功或失败。
首先,使用条件检查创建一个执行 T-SQL 语句任务。从原始问题中的示例来看,这看起来像这样:
如果这不是镜像主服务器,则此代码生成错误,如果它是主服务器,则不会出错。接下来,创建第二个执行 T-SQL 语句任务并将其链接到第一个具有成功条件的任务。如果这不是镜像主节点,我们将不执行第二个任务,序列将结束。如果这是首要任务,我们将继续执行第二个任务。第二个任务使用如下代码生成一个虚拟错误:
现在创建您的第三个任务并将其链接到第二个带有失败条件的任务。在第三个任务中,如果第一个任务中的条件为真,则执行您想做的任何事情。这可以是另一个执行 T-SQL 语句、备份任务、更新统计任务或其他任何内容。如果条件为假,我们将在第一个任务之后离开序列。如果条件为真,我们将通过虚拟错误继续执行第三个任务,该任务实际上完成了我们想要完成的工作。
任务 2 中出现虚拟错误的原因是为了使调用作业的最终错误状态报告我们想要的,并且我们还需要调整一些其他包属性以使其工作。转到属性窗口(如果它未打开,请从任一任务的右键菜单中打开它),然后单击顶部的下拉菜单。这列出了您可以更改属性的所有维护计划元素。单击 Subplan_1 Sequence,其中 Subplan_1 是您正在处理的子计划的名称。将 FailParentOnFailure 更改为 False。当我们在任务 1 中生成条件错误或在任务 2 中生成虚拟错误时,这将防止调用作业报告错误。接下来,转到 MyPackage Package 的属性,其中 MyPackage 是您正在使用的包的名称。更改最大错误计数为 2。这将导致调用作业在任务 2 中的虚拟错误仅产生一个错误时报告成功,但如果第三个任务也产生错误则报告失败。如果生成的唯一错误是任务 1 中的条件检查,它也会报告成功。
就是这样,我希望有人觉得这很有用。
对我来说,无需在 SQL 实例上安装 Information Services 的条件维护计划最简单的方法是使用 SQL Server Data Tools ( SSDT ):
当然,所有这一切都是可以实现的,没有 SSDT,只有使用纯更新 SQL 命令,如果您确切知道必须为变量修改哪些 XML 以及将“执行 SQL 任务”放入目标维护计划的包数据 XML 中。一旦将“执行 SQL 任务”节点插入到一个维护计划中,就可以通过 SSMS GUI 将“执行 SQL 任务”节点复制并粘贴到其他维护计划中,而无需使用其他工具。不幸的是,变量并非如此。