Row*_*haw 4 sql-server for-xml
我正在尝试使用FOR XMLSQL Server 的功能来生成一些具有某些特定名称空间的 XML。
我的目标 XML 应该类似于:
<ns1:CustomerInvoices xmlns:ns1="urn:example.com:Invoice:01.00">
<CustomerInvoice>
<Header>
<OrderDate>2001-11-13T00:00:00</OrderDate>
<SalesOrderNumber>SO44643</SalesOrderNumber>
</Header>
<Lines>
<LineTotal>3578.270000</LineTotal>
<UnitPrice>3578.2700</UnitPrice>
<OrderQty>1</OrderQty>
</Lines>
</CustomerInvoice>
<CustomerInvoice>...(abbreviated)...</CustomerInvoice>
</ns1:CustomerInvoices>
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当我使用该WITH XMLNAMESPACES子句时,命名空间声明出现在许多子节点上,而该 XML 的第三方使用者“宁愿不获取”,即我正在执行以下操作:
Use AdventureWorks2008
;WITH XMLNAMESPACES ('urn:example.com:Invoice:01.00' as ns1)
SELECT (SELECT hdr.OrderDate,
hdr.SalesOrderNumber
FOR XML PATH (''), TYPE) AS Header,
(SELECT line.LineTotal,
line.UnitPrice,
line.OrderQty
FROM Sales.SalesOrderDetail AS line
WHERE line.SalesOrderID = hdr.SalesOrderID
FOR XML PATH (''), TYPE) AS Lines
FROM Sales.SalesOrderHeader AS hdr
WHERE hdr.ModifiedDate = '2001-11-20'
FOR XML PATH('CustomerInvoice'), ROOT('ns1:CustomerInvoices')
Run Code Online (Sandbox Code Playgroud)
这使:
<ns1:CustomerInvoices xmlns:ns1="urn:example.com:Invoice:01.00">
<CustomerInvoice>
<Header>
<OrderDate xmlns:ns1="urn:example.com:Invoice:01.00">2001-11-13T00:00:00</OrderDate>
<SalesOrderNumber xmlns:ns1="urn:example.com:Invoice:01.00">SO44643</SalesOrderNumber>
</Header>
<Lines>
<LineTotal xmlns:ns1="urn:example.com:Invoice:01.00">3578.270000</LineTotal>
<UnitPrice xmlns:ns1="urn:example.com:Invoice:01.00">3578.2700</UnitPrice>
<OrderQty xmlns:ns1="urn:example.com:Invoice:01.00">1</OrderQty>
</Lines>
</CustomerInvoice>
<CustomerInvoice>...(abbreviated)...</CustomerInvoice>
</ns1:CustomerInvoices>
Run Code Online (Sandbox Code Playgroud)
是否可以调整查询以使名称空间正确,或者我是否必须将其加载到“其他内容”中以删除冗余的名称空间声明?
你不是一个人。
我建议对这一改进投赞成票。
上面的连接站点列出了一种解决方法:
追加/编辑:
我上面发布的第二个链接现已失效。
这是一个不同的链接:
文章名为
使用 FOR XML 解决方法时抑制嵌套选择语句中的命名空间属性 Arthur-Olcot
如果解决方法链接将来“失效”。