2016-04-18 4 views
1

Ich muss über 100 SSIS-Pakete innerhalb der msdb überwachen und ich muss alle Variablen und zugehörigen Werte aus jedem Paket ziehen. Ich habe das folgende Skript entwickelt, das irgendwie da ist (nur ein Paket für jetzt lesen), also kann ich alles innerhalb des Knoten DTS: Variable auflisten, aber ich bin nicht sicher, wie man gerade jede Variable und Wert extrahiert.Extrahieren von Variablen aus SSIS-Paket in der msdb

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

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

Also muss ich ObjektName von „DeleteBatchQty“ und es ist Wert „50000“ in dem obigen Beispiel und schließlich eine Liste aller Variablen.

Wenn jemand die Antwort hat, würde es sehr geschätzt.

Vielen Dank.

Antwort

1

Probieren Sie es wie folgt aus:

ich zuerst die XML-Code in einer Dummy-Tabelle füllen, um meine Testszenario zu halten nah an Ihrem aktuellen Ausgabe.

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) 

Sie können Ihre Passdatentypen gewählt haben und ein nicht varchar(max) an allen Orten ...

+0

Danke, perfekt das Beispiel arbeiten. Wie kann ich das gesamte XML-Paket in die Dummy-Tabelle laden? – PaulHR

+0

@PaulHR, versuche dein '; WITH ... FROM' mit meinem'; WITH ... FROM' zu ersetzen. Wenn "DTS: Variable" nicht der oberste Knoten ist, sollten Sie einen zweiten Schrägstrich in die '.nodes ('// DTS: Variable')' einfügen oder den vollständigen Pfad angeben. Und achten Sie darauf, dass XML case sensitiv ist (Ihr Namensraum "AS dts" stimmt nicht mit "DTS" überein) – Shnugo

+0

Perfekt, das funktioniert. Vielen Dank. Es war der extra Schrägstrich, den ich brauchte :) – PaulHR