1

xml と名前空間のフラグメントで FOR XML を使用すると、SQL Server 2005/2008 で奇妙な問題が発生します。これが問題のクエリです。

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="" を削除しますが、それをファイルに保持する必要があります。何か案は?

4

1 に答える 1

3

結果は正しいものです。テーブルには名前空間のない要素があるため、デフォルトの名前空間xmlns = "http://tempuri.org/newincomingxml.xsd"を使用してConsumers要素の下に要素を追加する場合、テーブルの要素はデフォルトの名前空間を上書きする必要があります戻る ""。

それはまさにあなたが見るべきものです。xmlns = ""がないということは、ConsumerType / FirstName/LastName要素が名前空間" http://tempuri.org/newincomingxml.xsd "にあることを意味します。これはfalseです。

おそらく必要なのは、ConsumerType / FirstName / LastName要素を「http://tempuri.org/newincomingxml.xsd」名前空間に移動して、親のConsumer要素の名前空間と一致させることです。

于 2010-02-26T18:56:27.717 に答える