さまざまなレベルのネストを使用して XML を生成しようとしていますが、単純化しすぎるリスクがあるため、出力 XML は大まかに次の形式になります。
<invoice number="1">
<charge code="foo" rate="123.00">
<surcharge amount="10%" />
</charge>
<charge code="bar" />
</invoice>
このために継承したデータベース スキーマでは、たまたま異なるテーブルに料金が格納されています。つまり、追加料金は、料金の発生元のテーブルに基づいて異なる方法で格納されます。
s をで使用できないことUNION
FOR XML
を考えると、CTE でいくつかのUNION
ing を行ったので、次のようにします。
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
今、それは信じられないほど近いです(ネストされた に注意してください<surcharge>
):
<invoice number="1">
<charge code="foo" rate="123.00">
<surcharge>
<surcharge amount="10%" />
</surcharge>
</charge>
<charge code="bar" />
</invoice>
しかし、新しい要素としてではなく、要素のコンテンツとして扱われる XML 列の値をエンド クエリに含める方法を見つける必要があります。これは可能ですか、それとも新しいアプローチを取る必要がありますか?