2017-02-28 17 views
0

を挿入:は、私は次のようなXML構造を持つXMLフィールドからリレーショナル表データに

SET @TheXML = 
<MailingCompany> 
    <Mailman> 
      <Name>Jamie</Name> 
      <Age> 24 </Age> 
       <Letter> 
        <DestinationAddress> 440 Mountain View Parade </DestinationAddress> 
        <DestinationCountry> USA </DestinationCountry> 
        <OriginCountry> Australia </OriginCountry> 
        <OriginAddress> 120 St Kilda Road </OriginAddress> 
       </Letter> 
    </Mailman> 
</MailingCompany> 

は基本的に私は、Mailmanのと手紙の子供の抽出それぞれにクエリを書かれ、値を挿入しています次のようなリレーショナルテーブルへ:

INSERT INTO dbo.[Mailman] 
SELECT 
    NULLIF(t.value('Name[1]','varchar(100)'),'') as Name, 
    NULLIF(t.value('Age[1]','varchar(10)'),'') as Age 
FROM @TheXML.nodes('MailingCompany/Mailman') as MailmanTemp(t) 

SET @MailPersonFK = SCOPE_IDENTITY(); 


INSERT INTO dbo.[Letter] 
SELECT 
    NULLIF(t.value('DestinationAddress[1]','varchar(100)'),'') as DestinationAddress, 
    NULLIF(t.value('DestinationCountry[1]','varchar(100)'),'') as DestinationCountry, 
    NULLIF(t.value('OriginCountry[1]','varchar(100)'),'') as OriginCountry, 
    NULLIF(t.value('OriginAddress[1]','varchar(100)'),'') as OriginAddress 
    @MailPersonFK AS MailmanID 
FROM @TheXML.nodes('MailingCompany/Mailman/Letter') as LetterTemp(t) 

私の問題は、私が唯一のノードの名前が「データが移入されたときにMailmanのテーブルに挿入することです。ノード 'DestinationAddress'を持つレターに挿入するのと同じことです。

親ノードが常にMailingCompanyになるとは限らないことに注意してください。Mailmanには多くの文字を割り当てることができます。

ありがとうございます!

答えて

1

私は次のようにあなたのnodes()方法でXPathを変更すると、あなたの要件を満たしていると考えている:

ここ
/*/Mailman[Name[text()!=""]] 

、我々は唯一の限り、彼らは任意のトップレベル要素の子であるとして、Mailmanの要素を取得し、テキストデータが含まれている場合(暗黙的にも存在する必要があります)。

/*/Mailman/Letter[DestinationAddress[text()!=""]] 

この1つはトップレベルノードの子である文字を取得しますいずれかが存在する場合、それは、複数の文字要素を取得します。テキストコンテンツに対しても同じテストを適用します。あなたが提供するXMLに正常にテスト

  • <Name>Jamie</Name>は - 名前と年齢
  • <Name></Name>を返された - 何も
  • ませ<Name>要素を返さない - 何も返されません。

宛先アドレスについての同様のテスト。

+0

パーフェクト!どうもありがとうございました! – Mark

関連する問題