从存储在msdb中的SSIS包中提取变量

时间:2016-04-18 12:57:20

标签: sql xml variables ssis

我需要审计msdb中的100多个SSIS包,我需要从每个包中提取所有变量和相关值。我已经提出了以下脚本(现在只读取一个包)所以我可以在DTS:Variable节点中列出所有内容,但我不确定如何提取每个变量和值。< / p>

;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>

所以我需要&#34; DeleteBatchQty&#34;的ObjectName。它的价值&#34; 50000&#34;在上面的例子中,最终是所有变量的列表。

如果有人有答案,那就非常感激。

谢谢。

1 个答案:

答案 0 :(得分: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) ......