SQL Server - füge zwei XML mit nur .modify () zusammen

9

Angenommen, wir haben:

%Vor%

Playground

Nun möchte ich 2 XMLs basierend auf id Attribut zusammenführen:

Endergebnis für Benutzer mit ID = 1:

%Vor%

Bitte beachten Sie, dass es nicht 2 XMLs kombiniert, sondern "upsert" Operation.

Anmerkungen:

  • Ich weiß, dass diese Art von Schema die Normalisierung der Datenbank verletzt und normalisiert, es ist der Weg zu gehen (aber nicht in diesem Fall)
  • Ich kenne eine Lösung, die abgeleitete Tabellen verwendet, .nodes() und .value() functions, um zuerst XML zu analysieren, dann zusammenzufassen und zurück zu schreiben

Ich suche nach XPath/XQuery Ausdruck, der ihn in eine Anweisung zusammenfügt (keine abgeleiteten Tabellen / dynamic-sql *):

* Wenn unbedingt benötigt, könnte Dynamic SQL verwendet werden, aber ich möchte es vermeiden.

%Vor%     
lad2025 29.01.2016, 09:26
quelle

4 Antworten

4

Nachdem ich es eine Weile versucht habe, denke ich, dass das nicht möglich ist ...

Hier gibt es eine ähnliche Frage: XQuery-Attribut in einem einzigen SQL-Aktualisierungsbefehl hinzufügen oder ersetzen

Das .modify(insert Expression1 ... ) erlaubt es nicht, Daten innerhalb eines über @sql:variable() oder sql:column()

übergebenen XML zu erhalten

Lesen Sie hier: Ссылка bei Expression1 - & gt; "Konstante XML oder eigenständige SQL: Spalte / SQL: Variable oder XQuery (auf die gleiche Instanz)

%Vor%

Sie könnten das zweite XML als solches deklarieren:

%Vor%

Aber dann haben Sie keine Chance, den Wert der ID als XQuery-Filter zu verwenden

%Vor%

Und zu guter Letzt denke ich, dass es keine Möglichkeit gibt, zwei verschiedene XML_DML-Anweisungen innerhalb eines Aufrufs von .modify() zu kombinieren.

Die einzige Idee, die ich hatte, war diese, aber es funktioniert nicht. IF scheint nur in einem Ausdruck verwendbar zu sein, aber nicht zwei unterscheiden zwischen zwei Ausführungspfaden

%Vor%

Also meine Schlussfolgerung: Nein, das ist nicht möglich ...

Die Lösung, die ich hier bereitgestellt habe Ссылка im zweiten Abschnitt ("Wenn Sie zwei Bücher-Strukturen zusammenführen wollen") ") wäre mein Weg, das zu lösen.

    
Shnugo 29.01.2016, 10:39
quelle
0

Versuchen Sie etwas wie das, es ist leicht zu verstehen, aber es ist langwierig.

Lassen Sie es mich wissen, wenn Sie ein Problem haben.

%Vor%     
KumarHarsh 01.02.2016 09:12
quelle
0

Das ist nicht der elegante One-Liner, auf den Sie gehofft haben. Trotzdem funktioniert es irgendwie, also werde ich teilen. (Und ich bin sicher, es gibt Raum für Verbesserungen.)

%Vor%     
D_T 03.02.2016 00:55
quelle
0

Ich denke, Sie können eine Abfrage wie folgt verwenden:

%Vor%

[ Playground ]

    
shA.t 07.02.2016 06:10
quelle

Tags und Links