AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 47117
Accepted
Idriss
Idriss
Asked: 2009-07-29 09:44:17 +0800 CST2009-07-29 09:44:17 +0800 CST 2009-07-29 09:44:17 +0800 CST

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

  • 772

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

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

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

ssms
  • 4 4 个回答
  • 5204 Views

4 个回答

  • Voted
  1. SQLChicken
    2009-07-29T09:57:28+08:002009-07-29T09:57:28+08:00

    老实说,如果您要进行这样的高级调整,最好编写解决方案的脚本,然后通过代理对其进行调度。维护计划虽然适用于非常简单的任务,但确实有其局限性。

    • 2
  2. Best Answer
    squillman
    2009-07-29T10:26:44+08:002009-07-29T10:26:44+08:00

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

    • 2
  3. mart1n
    2015-03-26T06:46:51+08:002015-03-26T06:46:51+08:00

    我对此有一个解决方案,但它并不优雅。这行得通,但它是一个杂物,永远不会被认为是“最佳实践”。

    该解决方案涉及使用人工生成的错误来控制流程,并调整包属性,以便调用作业的整体错误条件以我们想要的方式报告成功或失败。

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

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

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

    raiserror('dummy error', 16, 1)
    

    现在创建您的第三个任务并将其链接到第二个带有失败条件的任务。在第三个任务中,如果第一个任务中的条件为真,则执行您想做的任何事情。这可以是另一个执行 T-SQL 语句、备份任务、更新统计任务或其他任何内容。如果条件为假,我们将在第一个任务之后离开序列。如果条件为真,我们将通过虚拟错误继续执行第三个任务,该任务实际上完成了我们想要完成的工作。

    任务 2 中出现虚拟错误的原因是为了使调用作业的最终错误状态报告我们想要的,并且我们还需要调整一些其他包属性以使其工作。转到属性窗口(如果它未打开,请从任一任务的右键菜单中打开它),然后单击顶部的下拉菜单。这列出了您可以更改属性的所有维护计划元素。单击 Subplan_1 Sequence,其中 Subplan_1 是您正在处理的子计划的名称。将 FailParentOnFailure 更改为 False。当我们在任务 1 中生成条件错误或在任务 2 中生成虚拟错误时,这将防止调用作业报告错误。接下来,转到 MyPackage Package 的属性,其中 MyPackage 是您正在使用的包的名称。更改最大错误计数为 2。这将导致调用作业在任务 2 中的虚拟错误仅产生一个错误时报告成功,但如果第三个任务也产生错误则报告失败。如果生成的唯一错误是任务 1 中的条件检查,它也会报告成功。

    就是这样,我希望有人觉得这很有用。

    • 2
  4. Todor Kisov
    2017-09-28T23:45:47+08:002017-09-28T23:45:47+08:00

    对我来说,无需在 SQL 实例上安装 Information Services 的条件维护计划最简单的方法是使用 SQL Server Data Tools ( SSDT ):

    1. 从这里下载 SSDT 的安装(免费): https ://docs.microsoft.com/en-us/sql/ssdt/download-sql-server-data-tools-ssdt
    2. 创建一个新的 SSIS 项目。新项目的文件之一是Package.dtsx,它是一个 XML 文件。
    3. 使用以下查询从您的数据库中为您选择维护计划的 XML:
    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 列值复制粘贴到您创建的 SSIS 项目的Package.dtsx文件中。
    2. 添加变量并添加“执行 SQL 任务”节点。“执行 SQL 任务”允许您通过选择将数据检索到变量中,这与 SQL Server 维护计划具有的“执行 T-SQL 语句任务”不同。一旦插入 SQL 维护计划,“执行 SQL 任务”就有 GUI 可以直接编辑到没有 SSDT 的 SSMS 中。但只能使用 SSDT 或使用直接更改维护计划 XML 的 SQL 添加和编辑变量。不要忘记保存。
    3. 将Package.dtsx文件中的 XML 作为文本复制到剪贴板,并使用 SQL 命令更新msdb.dbo.sysssispackages表的维护计划packagedata字段。现在,如果您使用 SSMS 打开维护计划,您会发现添加的“执行 SQL 任务”有一个 GUI,甚至可以从 SSMS 完美配置。
    4. 在将所需信息收集到变量中的“执行 SQL 任务”之后,使用表达式创建约束/链接。约束/链接必须连接应该有条件地执行的节点。表达式将指示流程遵循哪些约束/链接,哪些不遵循。表达式将变量数据用于条件。这可以通过 SSMS GUI 完成,无需其他工具。

    当然,所有这一切都是可以实现的,没有 SSDT,只有使用纯更新 SQL 命令,如果您确切知道必须为变量修改哪些 XML 以及将“执行 SQL 任务”放入目标维护计划的包数据 XML 中。一旦将“执行 SQL 任务”节点插入到一个维护计划中,就可以通过 SSMS GUI 将“执行 SQL 任务”节点复制并粘贴到其他维护计划中,而无需使用其他工具。不幸的是,变量并非如此。

    • 0

相关问题

  • SQL Server 2005:复制 SQL Server 代理作业?

  • 使用 SQL Server 2008 Management Studio 连接到 SQL Server 2005 数据库

  • 使用 SQL Server Management Studio 修改 MSSQL 2000 数据库的属性是否具有破坏性?

  • 尝试在 Management Studio 中查看属性时出错

  • 为什么 SQL Server Management Studio 有时会丢失我的身份验证信息?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve