Я пытаюсь сгенерировать некоторый XML с различными уровнями вложенности, и с риском чрезмерного упрощения выходной XML будет свободно иметь формат:
<invoice number="1">
<charge code="foo" rate="123.00">
<surcharge amount="10%" />
</charge>
<charge code="bar" />
</invoice>
В схеме базы данных, которую я унаследовал для этого, сборы хранятся в разных таблицах, что означает, что сборы хранятся по-разному в зависимости от таблицы, откуда был сбор.
Учитывая, что вы не можете использовать UNION
s с FOR XML
, я сделал некоторые UNION
в CTE, поэтому что-то вроде:
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, который будет рассматриваться как содержимое элемента, а не как новый элемент. Возможно ли это, или мне нужен новый подход?