【问题标题】:Query msdb.dbo.sysssispackages XML for specific values查询 msdb.dbo.sysssispackages XML 以获取特定值
【发布时间】:2014-02-13 09:26:15
【问题描述】:

我正在尝试查询msdb.dbo.sysssispackages 以获取有效的维护计划,但我不知道如何查询packagedata 列中的XML。我在 SO 上找到了一些其他与 XML 相关的 SQL 问题,但到目前为止,似乎没有什么能完全符合我的要求。

msdb.dbo.sysssispackages.packagedata 中的 XML 如下所示:

<DTS:Executable DTS:ExecutableType="Microsoft.SqlServer.Management.DatabaseMaintenance.DbMaintenanceReindexTask, Microsoft.SqlServer.MaintenancePlanTasks, version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" DTS:ThreadHint="0">
      <DTS:Property DTS:Name="TaskContact">Rebuild Index Task; Microsoft Corporation; Microsoft SQL Server v9; © 2004 Microsoft Corporation; All Rights Reserved;http://www.microsoft.com/sql/support/default.asp;1</DTS:Property>
      <DTS:Property DTS:Name="LocaleID">-1</DTS:Property>
      <DTS:Property DTS:Name="ObjectName">Rebuild Index Task</DTS:Property>
      <DTS:Property DTS:Name="DTSID">{E4A9C2C8-F24F-4AE3-AC3D-F8B6729F1126}</DTS:Property>
      <DTS:Property DTS:Name="Description">Rebuild Index Task</DTS:Property>
      <DTS:Property DTS:Name="CreationName">Microsoft.SqlServer.Management.DatabaseMaintenance.DbMaintenanceReindexTask, Microsoft.SqlServer.MaintenancePlanTasks, version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91</DTS:Property>
      <DTS:EventHandler>
        <DTS:Property DTS:Name="EventID">0</DTS:Property>
        <DTS:Property DTS:Name="EventName">OnPostExecute</DTS:Property>
        <DTS:Property DTS:Name="LocaleID">-1</DTS:Property>
        <DTS:Property DTS:Name="DTSID">{263C94D7-6FEC-4A4A-9EA1-2557E3892E74}</DTS:Property>
        <DTS:Property DTS:Name="CreationName">OnPostExecute</DTS:Property>
        <DTS:Variable>
          <DTS:Property DTS:Name="Namespace">System</DTS:Property>
          <DTS:Property DTS:Name="IncludeInDebugDump">6789</DTS:Property>
          <DTS:Property DTS:Name="ObjectName">Propagate</DTS:Property>
          <DTS:Property DTS:Name="DTSID">{DB1B0594-A0F1-4C48-867E-C5A9C6BB9322}</DTS:Property>
          <DTS:Property DTS:Name="Description">The propagate property of the event</DTS:Property>
          <DTS:Property DTS:Name="CreationName" />
          <DTS:VariableValue DTS:DataType="11">0</DTS:VariableValue>
        </DTS:Variable>
      </DTS:EventHandler>
      <DTS:EventHandler>
        <DTS:Property DTS:Name="EventID">0</DTS:Property>
        <DTS:Property DTS:Name="EventName">OnPreExecute</DTS:Property>
        <DTS:Property DTS:Name="LocaleID">-1</DTS:Property>
        <DTS:Property DTS:Name="DTSID">{AD9E11AB-D830-41A7-8A38-FC2E89B71FD1}</DTS:Property>
        <DTS:Property DTS:Name="CreationName">OnPreExecute</DTS:Property>
        <DTS:Variable>
          <DTS:Property DTS:Name="Namespace">System</DTS:Property>
          <DTS:Property DTS:Name="IncludeInDebugDump">6789</DTS:Property>
          <DTS:Property DTS:Name="ObjectName">Propagate</DTS:Property>
          <DTS:Property DTS:Name="DTSID">{8A2A2399-1C88-4247-91E8-B87EB217F052}</DTS:Property>
          <DTS:Property DTS:Name="Description">The propagate property of the event</DTS:Property>
          <DTS:Property DTS:Name="CreationName" />
          <DTS:VariableValue DTS:DataType="11">0</DTS:VariableValue>
        </DTS:Variable>
      </DTS:EventHandler>
      <DTS:ObjectData>
        <SQLTask:SqlTaskData xmlns:SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask" SQLTask:Connection="{8E20FB62-A80C-4A72-9789-C250348EDB1B}" SQLTask:DatabaseSelectionType="3" SQLTask:ServerVersion="10" SQLTask:ExtendedLogging="False" SQLTask:LocalConnectionForLogging="Local server connection" SQLTask:TaskName="" SQLTask:IgnoreDatabasesInNotOnlineState="False" SQLTask:UseOriginalAmount="True" SQLTask:Percentage="-1" SQLTask:Sort="False" SQLTask:KeepOnline="False" SQLTask:SkipUnsupported="False">
          <SQLTask:SelectedDatabases SQLTask:DatabaseName="AdventureWorks2008R2" />
        </SQLTask:SqlTaskData>
      </DTS:ObjectData>
    </DTS:Executable>
  1. 如何找到&lt;DTS:Executable DTS:ExecutableType= 包含“Microsoft.SqlServer.Management.DatabaseMaintenance.DbMaintenanceReindexTask”的行,就像在 xml 的第一行中找到的一样?
  2. 如何找到&lt;DTS:Property DTS:Name="ObjectName"&gt;A value here&lt;/DTS:Property&gt;匹配搜索字符串的行?

【问题讨论】:

    标签: sql sql-server xml tsql sql-server-2008-r2


    【解决方案1】:

    您可以使用xquery 来执行此操作。它有点少数:

    第 1 点:

    ;WITH XMLNAMESPACES 
    (
        'www.microsoft.com/SqlServer/Dts' AS DTS
       ,'www.microsoft.com/SqlServer/Dts/Tasks' AS SQLTask)
    SELECT
      Nodes.node.value('(@DTS:ExecutableType)[1]', 'varchar(100)') AS ExecutableType,
      Nodes.node.value('(DTS:Property[@DTS:Name="TaskContact"])[1]', 'varchar(100)') AS TaskContact
    FROM
      (
        SELECT 
             CAST(CAST([packagedata] as varbinary(max)) as xml) PackageDataXml
        FROM      
             [msdb].[dbo].[sysssispackages]
      ) SysPackages
      CROSS APPLY 
        SysPackages.PackageDataXml.nodes('/DTS:Executable/DTS:Executable/DTS:Executable') Nodes(Node)
    WHERE
      Nodes.node.value('@DTS:ExecutableType', 'varchar(100)') 
        LIKE 'Microsoft.SqlServer.Management.DatabaseMaintenance.DbMaintenanceReindexTask%';
    

    对于第 2 点,where 子句是这样的:

    WHERE
      Nodes.node.value('(DTS:Property[@DTS:Name=''ObjectName''])[1]', 'varchar(50)') 
       = 'Rebuild Index Task';
    

    MSDN Social的帮助下

    重点

    1. 需要将packagedata列通过varbinary转换为xml
    2. 使用交叉应用将“根节点选择器”xpath 应用于所有行
    3. 要寻址命名空间,请通过WITH XMLNAMESPACES 添加别名
    4. Xquery 如.value 需要选择标量,因此(xpath)[1]

    【讨论】:

    • 测试点 1,没有返回任何结果。当我删除 WHERE 子句时,我从具有不同可执行类型的兄弟节点(这是正确的术语吗?)返回结果。
    • 哦,我想这是因为我要查询的 DTS:Executable 实际上是另一个 DTS:Executable 节点的子节点。我没有在结果中看到它的兄弟姐妹,我看到的是它的父级和它的父级的兄弟姐妹。我会将其添加到您的答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2019-08-11
    • 2019-09-07
    • 2014-12-18
    相关资源
    最近更新 更多