SQL server "für xml", mehrere Tabellen, mehrere Knoten

Ist es möglich, mehrere Tabellen gleichzeitig auszuwählen? Zum Beispiel kann ich:

SELECT ( SELECT * FROM Articles FOR XML PATH('article'), TYPE ) FOR XML PATH('articles'), ROOT('data') 

und

 SELECT ( SELECT * FROM ArticleTypes FOR XML PATH('articleType'), TYPE ) FOR XML PATH('articleTypes'), ROOT('data') 

Kann ich mich beiden anschließen, damit ich die folgende Ausgabe bekomme? Ich kann UNION nicht verwenden, da die Tabellenstrukturen nicht übereinstimmen.

 <data> <articles> <article>...</article> ... </articles> <articleTypes> <articleType>...</articleType> ... </articleTypes> </data> 

   

Jede Spalte in einer Vereinigung hat nur einen Spaltennamen, und dieser Spaltenname wird aus der ersten Abfrage genommen. Sie können das um die Spalten von der anderen Tabelle zu null , anstatt sie auszulassen.

 select * from ( select 1 as 'Articles/Id' , 'Name' as 'Articles/Name' , null as 'ArticleType/Id' , null as 'ArticleType/Type' ) Articles union all select * from ( select null as 'Articles/Id' , null as 'Articles/Name' , 1 as 'ArticleType/Id' , 'Type' as 'ArticleType/Type' ) ArticleType FOR XML PATH(''), ROOT('data') 

Das führt zu:

 <data> <Articles> <Id>1</Id> <Name>Name</Name> </Articles> <ArticleType> <Id>1</Id> <Type>Type</Type> </ArticleType> </data> 

Abhängig von der Version von SQL server, die Sie verwenden. Wie wäre es mit so einem Stapelüberlauf?

Es ist möglich, NICHT alle Spalten in den Tabellen aufzulisten, NICHT müssen eine UNION verwenden und müssen keine wiederholten Spalten mit der folgenden Methode haben:

  1. Ergreifen Sie die data, die Sie in temp Tabellen benötigen (in meinem Fall war es von einem anderen Bediener mit openquery, also war es einfacher aber kann übersprungen werden, wenn die Reihen lokal sind)
  2. Cursor durch die Hauptsteuertabelle und für jede Primärschlüsselzeile:
    • generieren Sie Ihre Multi-Level-XML-Pfad-Ausgabe und legen Sie sie in eine XML-Variable
    • füge deine xml-Variable in eine Ausgabe tempXMLOutput-Tabelle mit einer Spalte vom Typ xml ein
  3. Sobald Sie alle data im Cursor ausgegeben haben, geben Sie Ihre tempXMLOutput Tabelle ein

Dies zeigt alle data ohne die funky wiederholen Spalten und es dauert nicht lange zu Code für.