2017-04-14 1 views
0

Ich habe keine Erfahrung in XML-Programmierung in Sql Server, aber versuche, etwas mit Code, um die SQLStatementSource Inhalte aus einer SSIS-Datei (DTSX-Dateierweiterung) zu lesen.Wie man SQL zieht

Ich fand diesen Code online und fügte die dritte Komponente an der Spitze für SQLStatementSource hinzu, aber ich gebe nichts zurück. Ich weiß nicht, wie man eine dtsx-Datei anhängt, aber ich nehme an, dass es auf irgendwelchen verwendet werden könnte.

Irgendwelche Zeiger?

SELECT Pkg.props.value('declare namespace p1="www.microsoft.com/SqlServer/Dts"; 
           ./p1:Property[@p1:Name=''ObjectName''][1]','nvarchar(max)') as TaskName 
    ,  Pkg.props.value('declare namespace p1="www.microsoft.com/SqlServer/Dts"; 
           ./@p1:ExecutableType','nvarchar(max)') as TaskType 
    ,  Pkg.props.value('declare namespace p1="www.microsoft.com/SqlServer/Dts"; 
           ./@p1:SqlStatementSource','nvarchar(max)') as TaskSql 

    FROM (
      select cast(pkgblob.BulkColumn as XML) pkgXML 
      from openrowset(bulk 'C:\Users\DSNoS\OneDrive\Documents\LoadingProviderContracts_New.dtsx',single_blob) as pkgblob 
      ) t 
    CROSS APPLY pkgXML.nodes('declare namespace DTS="www.microsoft.com/SqlServer/Dts"; 
           //DTS:Executable[@DTS:ExecutableType!=''STOCK:SEQUENCE'' 
          and @DTS:ExecutableType!=''STOCK:FORLOOP'' 
          and @DTS:ExecutableType!=''STOCK:FOREACHLOOP'' 
          and not(contains(@DTS:ExecutableType,''.Package.''))]' 
          ) Pkg(props) 
+0

Ist diese Frage gelöst? Brauchen Sie weitere Hilfe? Bitte erlauben Sie mir einen Hinweis: Wenn diese Frage gelöst ist, wäre es sehr nett von Ihnen, die Akzeptanzprüfung unter dem Stimmzähler der (besten) Antwort anzukreuzen. Dies wird 1) dieses Problem als gelöst markieren 2) es den Anhängern erleichtern, die beste Lösung zu finden 3) Punkte an den Beantworter zu zahlen und 4) Punkte an Sie zu zahlen. Wenn Sie die Grenze von 15 Punkten überschritten haben, werden Sie zusätzlich gebeten, über Beiträge zu stimmen. Dies ist der SO-Weg, um Danke zu sagen. Glückliche Kodierung! – Shnugo

Antwort

0

Ich fand eine example of a dtsx file here.

Könnte sein, dass das einzige, was Sie ändern müssen, ist " statt '' (echte doppelte Anführungszeichen anstelle von doppelten Hochkommas) zu verwenden.

In Ihrem Beispiel verwenden Sie implizite Namensraum Deklarationen immer wieder, dies sollte einfacher mit einem deklarierten DEFAULT Namensraum sein.

Im Folgenden gibt es ein sehr reduziertes Beispiel, aber Sie werden genug Hinweise bekommen, wie man das liest.

Wichtiger Hinweis: Mit einem Standardnamespace können Sie das Namespacepräfix für Elementnamen, aber nicht für Attribute weglassen. Deshalb verwende ich einen Platzhalter mit Attributen.

DECLARE @dtsx XML= 
N'<?xml version="1.0"?> 
<DTS:Executable xmlns:DTS="www.microsoft.com/SqlServer/Dts" DTS:ExecutableType="MSDTS.Package.1"> 
    <DTS:Property DTS:Name="PackageFormatVersion">2</DTS:Property> 
    <DTS:Property DTS:Name="SuppressConfigurationWarnings">0</DTS:Property> 
    <DTS:ConnectionManager> 
    <DTS:Property DTS:Name="DelayValidation">0</DTS:Property> 
    <DTS:ObjectData> 
     <DTS:ConnectionManager> 
     <DTS:Property DTS:Name="ConnectionString">Data Source=VSSQLDB02;Initial Catalog=MSSQLTipsSSISTutorial;Provider=SQLNCLI;Integrated Security=SSPI;Auto Translate=false;</DTS:Property> 
     </DTS:ConnectionManager> 
    </DTS:ObjectData> 
    </DTS:ConnectionManager> 
</DTS:Executable>'; 

WITH XMLNAMESPACES(DEFAULT 'www.microsoft.com/SqlServer/Dts') 
SELECT @dtsx.value(N'(//Property/@*:Name)[1]',N'nvarchar(max)') AS FirstPropertyAnyWhere 
     ,@dtsx.value(N'(/Executable/Property[@*:Name="SuppressConfigurationWarnings"]/text())[1]',N'int') PropertyWithACertainName 
     ,@dtsx.value(N'(/Executable/ConnectionManager/ObjectData/ConnectionManager/Property[@*:Name="ConnectionString"]/text())[1]',N'nvarchar(max)') 
Verwandte Themen