2017-02-28 64 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> 

基本上我與提取書寫的查詢每個郵遞員和字母的兒童,並插入值到關係表中,它看起來像以下:

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) 

我的問題是,我只想當節點「名稱」中填充數據插入到表郵差。與節點'DestinationAddress'一起插入Letter的信息也是如此。

它也可能是有用的注意到,父節點並不總是要MailingCompany,並且郵差可以有很多字母。

謝謝大家!

回答

1

我相信,在您的nodes()方法改變的XPath到下面將滿足您的要求:

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

在這裏,我們得到了郵遞員的元素,只要是任何頂級元素的兒童,只有如果它們包含文本數據(也隱含地,它們必須存在)。

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

這個獲得任何頂級節點的孩子的信件,它會得到多個Letter元素,如果有的話。並對文本內容應用相同的測試。

您提供的XML成功測試:

  • <Name>Jamie</Name> - 返回的名字和年齡
  • <Name></Name> - 沒有返回
  • 沒有<Name>元素 - 沒有返回。

和目標地址的類似測試。

+0

完美!非常感謝你! – Mark

相關問題