2017-02-03 2 views
0

Ich habe eine XML-Datei erstellen, indem Sie eine Datenbank voller XPath-Einträge (MS SQL) beschreiben einige Konfigurationswerte abfragt (Format nicht veränderbar ist)Build-XML-Daten aus einer SQL-Tabelle mit XPath und Attributwerten

z.B. 3 Spalten, varchar

Path       Attribute Value 
/configuration/options/startup showSplash 1 
/configuration/settings   idletime 1400 
/configuration/options/defaults maxWindows 5 

begann ich eine xml zusammen mit C# -Code setzen, mergin überlappende pathes aber dann dachte über das Tun, die mit SQL.

<configuration> 
    <options> 
    <startup showSplash="1" /> 
    <defaults maxWindows="1" /> 
    </options> 
    <settings idletime="1400" /> 
</configuration> 

Ist das möglich - ich nicht so etwas überall fanden

+0

Wie dynamisch ist diese XML- und Datendarstellung? und muss dies mit SQL Server getan werden? –

+0

jeder xpath beginnt mit der Konfiguration, aber dann kann alles passieren und variable Tiefe - meine erste Vermutung war, es außerhalb von SQL Server zu programmieren, was überhaupt kein Problem wäre. Ich würde gerne wissen, ob es mit einer gespeicherten Prozedur zum Beispiel möglich ist (und nicht unglaublich schwierig) – JoeCLion

+0

während nicht unmöglich ... tun dies in Tsql wird verrückt schwierig sein. Sie sollten SQL CLR besser verwenden, wenn Sie es aus einer Ansicht zurückgeben möchten. Wenn es sich um eine fixe Menge von Werten handelt, können Sie eine Ersatzabfrage schreiben, aber das dynamische Erstellen einer XML-Datei basierend auf solchen Pfaden ist nicht das, was SQL entwickelt wurde. –

Antwort

0

Sie eine Auswahlliste von Ihrer ursprünglichen Tabelle erstellen können, die select-Anweisung in eine dynamische verkettet werden können und finaly ausführen mit sp_sqlexec.

Ich habe so etwas versucht.

DECLARE @strPaths VARCHAR(MAX) 
DECLARE @sqlString NVARCHAR(MAX) 

SELECT 
    @strPaths 
    = 
    STUFF(
      (
       SELECT 
         ', ' + Value + ' [' + SUBSTRING([Path], 2, LEN([Path]) - 1) + '/@' + Attribute + ']' 
        FROM yourTable 
        ORDER BY [Path] 
        FOR XML PATH('') 
      ) 
      ,1,2,'' 
     ) 

SET @sqlString = 'SELECT (SELECT ' + @strPaths + ' FOR XML PATH(''''), TYPE) [XML]' 

EXEC sp_sqlexec @sqlString 

, die die genaue XML zurückgibt Sie suchen

<configuration> 
    <options> 
    <defaults maxWindows="5" /> 
    <startup showSplash="1" /> 
    </options> 
    <settings idletime="1400" /> 
</configuration> 

aber wenn ich herausnehmen 'ORDER BY [Pfad]. Das resultierende XML ist völlig anders.

<configuration> 
    <options> 
    <startup showSplash="1" /> 
    </options> 
    <settings idletime="1400" /> 
    <options> 
    <defaults maxWindows="5" /> 
    </options> 
</configuration> 

Sie müssen also die Reihenfolge der Pfade sicher sein, um eine Lösung wie diese zu verwenden.

Fazit: Es kann nur getan werden, wenn Sie ein Bestellkriterium haben.

+0

Vielen Dank, Ich werde dies morgen ausprobieren und rank Ihre Antwort – JoeCLion

+0

Es gab ein kleines Problem, ich musste zusätzliche einfache Anführungszeichen um den Wert setzen. scheint perfekt zu funktionieren – JoeCLion

Verwandte Themen