Ich versuche, einige XML mit verschiedenen Ebenen der Verschachtelung und auf die Gefahr von Über Vereinfachung der XML-Ausgabe wird lose von dem Format zu generieren:Wie kann ich CTEs mit einer FOR XML-Klausel kombinieren?
<invoice number="1">
<charge code="foo" rate="123.00">
<surcharge amount="10%" />
</charge>
<charge code="bar" />
</invoice>
Das Datenbankschema I für diese geerbt haben passiert, dass Gebühren in unterschiedlichen Tabellen gespeichert werden, was bedeutet, dass die Aufschläge auf der Grundlage der Tabelle, von der die Gebühr stammt, unterschiedlich gespeichert werden.
Da Sie cannot use UNION
s with FOR XML
ich einige UNION
getan haben in einem WAK-ing, so etwas entlang der Linien von:
WITH Charges ([@code], [@rate], surcharge, InvoiceId) AS (
SELECT code AS [@Code], amount AS [@rate], NULL as surcharge, InvoiceId
FROM item.charges
UNION ALL
SELECT
code AS [@Code],
amount AS [@rate],
(
SELECT amount AS [@amount]
FROM order.surcharges os
WHERE oc.ChargeId = os.ChargeId
FOR XML PATH('surcharge'), TYPE
),
InvoiceId
FROM order.charges oc
)
SELECT
Number AS [@number],
(
SELECT
[@code],
[@rate],
surcharge
FROM Charges
WHERE Charges.InvoiceId = i.InvoiceId
)
FROM Invoices i
FOR XML PATH('invoice'), TYPE
Nun, das ist unglaublich schließen, so dass (Beachten Sie die verschachtelte <surcharge>
) :
<invoice number="1">
<charge code="foo" rate="123.00">
<surcharge>
<surcharge amount="10%" />
</surcharge>
</charge>
<charge code="bar" />
</invoice>
Aber ich brauche einen Weg, um die End-Abfrage zu finden, den Wert einer XML-Spalte zu schließen, wenn der Gehalt des Elements behandelt zu werden, und nicht als ein neues Element. Ist das möglich, oder muss ich einen neuen Ansatz wählen?
In der Auswahlliste kann nur ein Ausdruck angegeben werden, wenn die Unterabfrage nicht mit EXISTS eingeführt wird. – user3752281
@ user3752281 diese Lösung hat für mich funktioniert, also verstehe ich Ihren Kommentar nicht? –