如何通过SQL将Orders表的OrderNumber列生成指定格式的XML输出?
正确的SQL-XML脚本
要生成你需要的XML结构,需要调整子查询的嵌套方式,确保固定的<OrgLookup>只出现一次,同时所有<OrderNumberLookup>都被正确包裹在<OrderLookups>节点下。以下是修正后的代码:
SELECT 'ABC_INC' AS 'OrgLookup/OrgName', ( SELECT OrderNumber AS 'OrderNumber' FROM [dbo].[Orders] FOR XML PATH('OrderNumberLookup'), TYPE, ROOT('OrderLookups') ) FOR XML PATH('OrderRequest'), TYPE
代码说明:
- 固定
<OrgLookup>节点:通过'ABC_INC' AS 'OrgLookup/OrgName'直接构造嵌套节点,确保<OrgLookup>下包含<OrgName>子节点。 <OrderLookups>与<OrderNumberLookup>嵌套:- 子查询从
Orders表中读取所有OrderNumber,用FOR XML PATH('OrderNumberLookup')生成每个<OrderNumberLookup>节点。 - 添加
ROOT('OrderLookups')让所有订单号节点被包裹在<OrderLookups>根节点下,TYPE参数确保子查询返回的XML是正确的XML类型,而非字符串。
- 子查询从
- 外层
<OrderRequest>根节点:最后用FOR XML PATH('OrderRequest')将所有内容包裹在根节点中。
原代码的问题:
- 直接从
Orders表查询会导致每一行订单都生成一个<OrderRequest>节点,重复输出内容。 - 子查询的嵌套逻辑错误,没有正确将
<OrderNumberLookup>集合包裹在<OrderLookups>下,且未使用TYPE参数导致XML被转义为字符串。
示例输出(假设Orders表有1111、1112两个订单号):
<OrderRequest> <OrgLookup> <OrgName>ABC_INC</OrgName> </OrgLookup> <OrderLookups> <OrderNumberLookup> <OrderNumber>1111</OrderNumber> </OrderNumberLookup> <OrderNumberLookup> <OrderNumber>1112</OrderNumber> </OrderNumberLookup> </OrderLookups> </OrderRequest>
内容的提问来源于stack exchange,提问作者SidC
相关产品推荐
相关产品推荐

