Erstelle neue XML aus gespeichertem XML-Wert

Wir speichern ziemlich große XML-Blobs (in einer Spalte von XML Typ) und ich verfolge ein Skunkworks-Projekt, um zu versuchen, eine Untermenge des XML auf der Fliege aufzubuild, wenn nötig.

Angenommen, ich habe diesen XML-Blob in unserer database-Tabelle in einer bestimmten Spalte gespeichert:

 <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 ich aussteigen möchte, ist das, um die obige Dokumentstruktur grundsätzlich neu zu erstellen, aber nur eines der items Kinder, also 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 mich nur für den observeItem interessiere (das Element-Element kann eine beliebige Anzahl von Kindern haben, aber ich werde mich nur für eine einzelne von ihnen interessieren).

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

Ich habe eine Lösung gefunden, aber ich bin nicht ganz damit zufrieden:

 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 mag es nicht, die root explizit noch die items zu spezifizieren, aber ich denke, dieser Ansatz könnte mich erreichen.