【问题标题】:Extracting Variables from SSIS package stored in the msdb从存储在 msdb 中的 SSIS 包中提取变量
【发布时间】:2016-04-18 12:57:19
【问题描述】:

我需要审核 msdb 中的 100 多个 SSIS 包,并且我需要从每个包中提取所有变量和相关值。我想出了下面的脚本(目前只读取一个包),因此我可以列出 DTS:Variable 节点中的所有内容,但我不确定如何提取每个变量和值。

;WITH XMLNAMESPACES ('www.microsoft.com/SqlServer/Dts' as dts) 
SELECT Con.Str.value('.', 'varchar(400)')
FROM (
        SELECT CONVERT(XML, CONVERT(VARBINARY(MAX), packagedata)) AS pkgXML
    FROM msdb.dbo.sysdtspackages90
    WHERE name = 'SSISPackageName'

        ) pkgblob
CROSS APPLY pkgXML.nodes('//dts:Variable') as Con(Str)

示例 XML

<DTS:Variable>
    <DTS:Property DTS:Name="Expression" />
    <DTS:Property DTS:Name="EvaluateAsExpression">0</DTS:Property>
    <DTS:Property DTS:Name="Namespace">User</DTS:Property>
    <DTS:Property DTS:Name="ReadOnly">0</DTS:Property>
    <DTS:Property DTS:Name="RaiseChangedEvent">0</DTS:Property>
    <DTS:VariableValue DTS:DataType="3">50000</DTS:VariableValue>
    <DTS:Property DTS:Name="ObjectName">DeleteBatchQty</DTS:Property>
    <DTS:Property DTS:Name="DTSID">{2A967BFC-BE6C-41C8-B574-6CB94D09C96E}    </DTS:Property>
    <DTS:Property DTS:Name="Description" />
    <DTS:Property DTS:Name="CreationName" />
  </DTS:Variable>

所以我需要“DeleteBatchQty”的 ObjectName,在上面的示例中它的值是“50000”,最终是所有变量的列表。

如果有人有答案,将不胜感激。

谢谢。

【问题讨论】:

    标签: sql xml variables ssis


    【解决方案1】:

    试试这样:

    我首先将 XML 填充到一个虚拟表中,以使我的测试场景接近您的实际问题。

    DECLARE @Dummy TABLE(packagedata XML);
    INSERT INTO @Dummy VALUES
    ('<DTS:Variable xmlns:DTS="www.microsoft.com/SqlServer/Dts">
        <DTS:Property DTS:Name="Expression" />
        <DTS:Property DTS:Name="EvaluateAsExpression">0</DTS:Property>
        <DTS:Property DTS:Name="Namespace">User</DTS:Property>
        <DTS:Property DTS:Name="ReadOnly">0</DTS:Property>
        <DTS:Property DTS:Name="RaiseChangedEvent">0</DTS:Property>
        <DTS:VariableValue DTS:DataType="3">50000</DTS:VariableValue>
        <DTS:Property DTS:Name="ObjectName">DeleteBatchQty</DTS:Property>
        <DTS:Property DTS:Name="DTSID">{2A967BFC-BE6C-41C8-B574-6CB94D09C96E}    </DTS:Property>
        <DTS:Property DTS:Name="Description" />
        <DTS:Property DTS:Name="CreationName" />
      </DTS:Variable>');
    
      ;WITH XMLNAMESPACES ('www.microsoft.com/SqlServer/Dts' as DTS) 
       SELECT Con.Str.value('(DTS:Property[@DTS:Name="Expression"])[1]','varchar(max)') AS Expression
             ,Con.Str.value('(DTS:Property[@DTS:Name="EvaluateAsExpression"])[1]','varchar(max)') AS EvaluateAsExpression
             ,Con.Str.value('(DTS:Property[@DTS:Name="Namespace"])[1]','varchar(max)') AS Namespace
             ,Con.Str.value('(DTS:Property[@DTS:Name="ReadOnly"])[1]','varchar(max)') AS ReadOnly
             ,Con.Str.value('(DTS:Property[@DTS:Name="RaiseChangedEvent"])[1]','varchar(max)') AS RaiseChangedEvent
             ,Con.Str.value('(DTS:VariableValue)[1]','varchar(max)') AS VariableValue
             ,Con.Str.value('(DTS:Property[@DTS:Name="ObjectName"])[1]','varchar(max)') AS ObjectName
             ,Con.Str.value('(DTS:Property[@DTS:Name="DTSID"])[1]','varchar(max)') AS DTSID
             ,Con.Str.value('(DTS:Property[@DTS:Name="Description"])[1]','varchar(max)') AS Description
             ,Con.Str.value('(DTS:Property[@DTS:Name="CreationName"])[1]','varchar(max)') AS CreationName
       FROM (
            SELECT CONVERT(XML, CONVERT(VARBINARY(MAX), packagedata)) AS pkgXML
            FROM @Dummy
            ) pkgblob
    CROSS APPLY pkgXML.nodes('/DTS:Variable') as Con(Str)
    

    您可以在所有地方都选择适合的数据类型,而不是 varchar(max)...

    【讨论】:

    • 谢谢,这个例子完美运行。如何将整个包 XML 加载到虚拟表中?
    • @PaulHR,尝试用我的;WITH ... FROM 替换您的;WITH ... FROM。如果DTS:Variable 不是最上面的节点,您应该在.nodes('//DTS:Variable') 中添加第二个斜杠或指定完整路径。并注意 XML 区分大小写(您的命名空间“AS dts”与“DTS”不匹配)
    • 完美的工作。谢谢你。这是我需要的额外斜线:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多