【发布时间】:2011-06-06 15:07:24
【问题描述】:
我正在尝试生成一些具有各种嵌套级别的 XML,并且冒着过度简化的风险,输出 XML 的格式将是松散的:
<invoice number="1">
<charge code="foo" rate="123.00">
<surcharge amount="10%" />
</charge>
<charge code="bar" />
</invoice>
我为此继承的数据库架构恰好将费用存储在不同的表中,这意味着附加费的存储方式根据费用来源的表而不同。
鉴于您 cannot use UNIONs with FOR XML,我在 CTE 中做了一些 UNIONing,所以大致如下:
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 列的值。这可能吗,还是我需要采取新的方法?
【问题讨论】:
标签: tsql sql-server-2008 common-table-expression for-xml