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

Sql 从存储在msdb中的SSIS包中提取变量,sql,xml,variables,ssis,Sql,Xml,Variables,Ssis,我需要审核msdb中的100多个SSI包,并且需要从每个包中提取所有变量和相关值。我已经提出了下面的脚本(目前只阅读一个包),这样我就可以列出DTS中的所有内容:Variable节点,但我不确定如何提取每个变量和值 ;WITH XMLNAMESPACES ('www.microsoft.com/SqlServer/Dts' as dts) SELECT Con.Str.value('.', 'varchar(400)') FROM ( SELECT CONVERT(XML, C

我需要审核msdb中的100多个SSI包,并且需要从每个包中提取所有变量和相关值。我已经提出了下面的脚本(目前只阅读一个包),这样我就可以列出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>

0
使用者
0
0
50000
删除批量数量
{2A967BFC-BE6C-41C8-B574-6CB94D09C96E}
因此,在上面的示例中,我需要ObjectName的“DeleteBatchQty”和它的值“50000”,最后是所有变量的列表

如果有人能给出答案,我们将不胜感激

谢谢。

像这样试试:

我首先将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)
DECLARE@Dummy表(packagedata-XML);
插入到@Dummy值中
('
0
使用者
0
0
50000
删除批量数量
{2A967BFC-BE6C-41C8-B574-6CB94D09C96E}
');
;使用XMLNAMESPACES(“www.microsoft.com/SqlServer/Dts”作为Dts)
选择Con.Str.value('(DTS:Property[@DTS:Name=“Expression”])[1],'varchar(max')作为表达式
,Con.Str.value('(DTS:Property[@DTS:Name=“evaluatesExpression”])[1],'varchar(max)')作为evaluatesExpression
,Con.Str.value('(DTS:Property[@DTS:Name=“Namespace”])[1],'varchar(max)')作为命名空间
,Con.Str.value('(DTS:Property[@DTS:Name=“ReadOnly”])[1],'varchar(max)')作为只读
,Con.Str.value('(DTS:Property[@DTS:Name=“RaiseChangedEvent”])[1],'varchar(max)'作为RaiseChangedEvent
,Con.Str.value('(DTS:VariableValue)[1],'varchar(max')作为VariableValue
,Con.Str.value('(DTS:Property[@DTS:Name=“ObjectName”])[1],'varchar(max)')作为ObjectName
,Con.Str.value('(DTS:Property[@DTS:Name=“DTSID”])[1],'varchar(max)')作为DTSID
,Con.Str.value('(DTS:Property[@DTS:Name=“Description”])[1],'varchar(max)'作为说明
,Con.Str.value('(DTS:Property[@DTS:Name=“CreationName”])[1],'varchar(max)')作为CreationName
从(
选择CONVERT(XML,CONVERT(VARBINARY(MAX),packagedata))作为pkgXML
来自@Dummy
)pkgblob
交叉应用pkgXML.nodes('/DTS:Variable')作为Con(Str)

您可以选择合适的数据类型,而不是所有位置的
varchar(max)

谢谢您,该示例非常有效。如何将整个包XML加载到虚拟表中?@PaulHR,尝试替换您的
;具有从
到我的
;具有从
。如果
DTS:Variable
不是最上面的节点,则应在
节点('//DTS:Variable')
中添加第二个斜杠或指定完整路径。而且要注意XML区分大小写(您的名称空间“AS dts”与“dts”不匹配),这是非常有效的。非常感谢。我需要的是额外的斜杠:)