2017-08-29 1 views
0

Wir speichern ziemlich große XML-Blobs (in einer Spalte von XML) und verfolgen ein Skunkworks-Projekt, um zu versuchen, bei Bedarf eine Teilmenge des XML-Codes zu erstellen.Neues XML aus gespeichertem XML-Wert erstellen

Lasst uns sagen, dass ich diese XML-Blob in unserer Datenbank-Tabelle in einer bestimmten Spalte gespeichert haben:

<root> 
    <header> 
     <id>1</id> 
     <name id="foo">Name</name> 
    </header> 
    <body> 
     <items> 
      <addItem> 
       <val>1</val> 
      </addItem> 
      <observeItem> 
       <val>2</val> 
      </observeItem> 
     </items> 
    </body> 
</root> 

Was möchte ich darauf bekommen, ist dies die oben Dokumentstruktur grundsätzlich neu ist aber nur enthalten eine der items Kinder, so zum Beispiel:

<root> 
    <header> 
     <id>1</id> 
     <name id="foo">Name</name> 
    </header> 
    <body> 
     <items> 
      <observeItem> 
       <val>2</val> 
      </observeItem> 
     </items> 
    </body> 
</root> 

Wenn ich gerade in der observeItem Rekord interessiert waren (das items Element eine beliebige Anzahl von Kindern haben kann, aber ich werde immer nur in einem einzigen interessiert sein Sie).

Ich weiß, ich kann etwas wie SELECT @XML.query('//items/child::*[2]') tun, um nur ein bestimmtes Kind Element zu bekommen, aber wie würde ich das vollständige Originaldokument in einer Abfrage mit nur einem dieser Kinder aufbauen?

+1

Können Sie nicht einfach das Kind aus der Struktur löschen? Oder brauchst du es dynamischer? –

+0

@MasterYoda muss dynamischer sein, und in der Praxis werde ich diese Struktur für jedes der "Kinder" aufbauen. Dieses ganze Bestreben ist einfach, einen Randfall zu unterstützen, bei dem etwas aus unserem Cache herausfallen würde, und wir müssten diese "Gegenstands" spezifische Struktur im laufenden Betrieb für Berichtszwecke erstellen. –

Antwort

0

Ich habe mit einer Lösung zu kommen, aber ich bin nicht ganz zufrieden damit:

DECLARE @XML XML = ' 
    <root> 
     <header> 
      <id>1</id> 
      <name id="foo">Name</name> 
     </header> 
     <body> 
      <items> 
       <addItem> 
        <val>1</val> 
       </addItem> 
       <observeItem> 
        <val>2</val> 
       </observeItem> 
      </items> 
     </body> 
    </root>' 


DECLARE @NthChild INT = 2 

SELECT 
    @XML.query('//header'), 
    @XML.query('//items/child::*[sql:variable("@NthChild")]') AS 'items' 
FOR XML PATH('root') 

ich mit nicht wie die root explizit angeben, noch die items, aber ich denke, diesen Ansatz könnte mich vorbeibringen.