1

我们在 SQL Server 2005/2008 中遇到了一个奇怪的问题,它使用带有 xml 和命名空间片段的 FOR XML。这是有问题的查询。

WITH XMLNAMESPACES ( 
DEFAULT 'http://tempuri.org/newincomingxml.xsd',
'http://tempuri.org/newincomingxml.xsd' as [xsi],
'http://tempuri.org/newincomingxml.xsd' as [a]
) 
SELECT 
 [@a:Source], [AddressCount], [ConsumerCount], [EmailCount], [PermissionCount]
, (
  SELECT 
   [Consumer]
  FROM tbcExportBRC_Current xmlmaster
  FOR XML PATH(''), ROOT('Consumers'), TYPE
 )
FROM tbcExportBRCBatch_Current xmlroot
FOR XML PATH('Datafeed'), TYPE

[客户]字段是一个 xml 片段。当我运行它时,我得到了。

<Datafeed xmlns:a="http://tempuri.org/newincomingxml.xsd" xmlns:xsi="http://tempuri.org/newincomingxml.xsd" xmlns="http://tempuri.org/newincomingxml.xsd" a:Source="DSD">
  <AddressCount>0</AddressCount>
  <ConsumerCount>0</ConsumerCount>
  <EmailCount>0</EmailCount>
  <PermissionCount>0</PermissionCount>
  <Consumers xmlns:a="http://tempuri.org/newincomingxml.xsd" xmlns:xsi="http://tempuri.org/newincomingxml.xsd" xmlns="http://tempuri.org/newincomingxml.xsd">
    <Consumer>
      <ConsumerType xmlns="">Individual</ConsumerType>
      <FirstName xmlns="">STEVE</FirstName>
      <LastName xmlns="">SMITH</LastName>
    </Consumer>
  </Consumers>
</Datafeed>

如果您注意到标记的子项中有xmlns=""。如果我们直接在表中查看片段,它看起来像这样。

      <ConsumerType>Individual</ConsumerType>
      <FirstName>STEVE</FirstName>
      <LastName>SMITH</LastName>

我可以删除默认命名空间

DEFAULT 'http://tempuri.org/newincomingxml.xsd',

它删除了 xmlns="" 但我们需要将其保留在文件中。有任何想法吗?

4

1 回答 1

3

结果是正确的。在表中,您有没有命名空间的元素,因此当您将它们添加到具有默认命名空间 xmlns="http://tempuri.org/newincomingxml.xsd"的消费者元素下时,表中的元素必须覆盖默认命名空间回到 ””。

这正是你应该看到的。没有 xmlns="" 意味着 ConsumerType/FirstName/LastName 元素位于命名空间“ http://tempuri.org/newincomingxml.xsd ”中,这是错误的。

您可能想要的可能是将 ConsumerType/FirstName/LastName 元素移动到“ http://tempuri.org/newincomingxml.xsd ”命名空间中,以匹配父 Consumer 元素的命名空间。

于 2010-02-26T18:56:27.717 回答