Как подавить пустые пространства имен с FOR XML в Sql Server - PullRequest
1 голос
/ 26 февраля 2010

Мы сталкиваемся со странной проблемой SQL Server 2005/2008, использующего FOR XML с фрагментами 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

Поле [Customer] является фрагментом 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 = "", но нам нужно сохранить это в файле. Есть идеи?

1 Ответ

3 голосов
/ 26 февраля 2010

Результат правильный. В таблице есть элементы без пространства имен, поэтому при добавлении их в элемент Consumers с пространством имен по умолчанию xmlns = "http://tempuri.org/newincomingxml.xsd", элементы из таблицы must переопределяют пространство имен по умолчанию обратно в "".

Это именно то, что вы должны увидеть. Отсутствие xmlns = "" будет означать, что элементы ConsumerType / FirstName / LastName находятся в пространстве имен "http://tempuri.org/newincomingxml.xsd",, что неверно.

Возможно, вам нужно переместить элементы ConsumerType / FirstName / LastName в пространство имен "http://tempuri.org/newincomingxml.xsd"", чтобы оно соответствовало пространству имен родительского элемента Consumer.

...