2014-09-25 199 views
1

以下查詢我試圖讀取MessageID和DocPurpose。但只有消息ID顯示罰款....誰能告訴我什麼我錯過?將apreciatedTSQL和肥皂信封

Declare @XmlData XML = 
'<Envelope xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message"> 
    <Header> 
    <MessageId>e96d3ee4-5cca-4b3e-be60-d1284a0fb02f</MessageId> 
    <Company>CompanyX</Company> 
    <Action>http://schemas.microsoft.com/dynamics/2008/01/services/ReturnOrderInService/create</Action> 
    <ConversationId>320034ab-f5ee-41b0-ba35-e0669c2bf1b8</ConversationId> 
    <RequestMessageId>e96d3ee4-5cca-4b3e-be60-d1284a0fb02f</RequestMessageId> 
    </Header> 
    <Body> 
    <MessageParts> 
     <ReturnOrderIn xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/ReturnOrderIn"> 
     <DocPurpose xmlns="">Original</DocPurpose> 
     <SenderId xmlns="">Xcorp</SenderId> 
     <SalesTable class="entity" xmlns=""> 
      <_DocumentHash>63cf8580-92fe-4b17-b15c-8e619eecf71f</_DocumentHash> 
      <CurrencyCode>USD</CurrencyCode> 
      <CustAccount>147854</CustAccount> 
      <LanguageId>en-us</LanguageId> 
      <Reservation>None</Reservation> 
      <ReturnDeadline>2014-10-10</ReturnDeadline> 
      <ReturnReasonCodeId>Reason</ReturnReasonCodeId> 
      <SalesName>Stores</SalesName> 
      <SalesLine class="entity"> 
      <DefaultDimension> 
       <Values xmlns="http://schemas.microsoft.com/dynamics/2008/01/sharedtypes"> 
       <Value> 
        <Name>Site</Name> 
        <Value>VN</Value> 
       </Value> 
       </Values> 
      </DefaultDimension> 
      <ExpectedRetQty>-5</ExpectedRetQty> 
      <ItemId>Else</ItemId> 
      <Name>Something</Name> 
      <PriceUnit>11.00</PriceUnit> 
      <SalesQty>-15.00</SalesQty> 
      </SalesLine> 
     </SalesTable> 
     </ReturnOrderIn> 
    </MessageParts> 
    </Body> 
</Envelope>' 

Declare @MessageId varchar(50) 
    ;WITH XMLNAMESPACES('http://schemas.microsoft.com/dynamics/2011/01/documents/Message' As a, 
        'http://schemas.microsoft.com/dynamics/2008/01/documents/ReturnOrderIn' As b, 
         default 'http://schemas.microsoft.com/dynamics/2011/01/documents/Message') 

Select @MessageId =MessageId from 
    (SELECT 
      t.c.value('a:MessageId[1]', 'varchar(50)') MessageId 
    FROM @XmlData.nodes('/Envelope/Header') AS t(c)) x 

Declare @DocPurpose varchar(50) 
    ;WITH XMLNAMESPACES('http://schemas.microsoft.com/dynamics/2011/01/documents/Message' As a, 
        'http://schemas.microsoft.com/dynamics/2008/01/documents/ReturnOrderIn' As b, 
         default 'http://schemas.microsoft.com/dynamics/2011/01/documents/Message') 

    Select @DocPurpose = DocPurpose from 
    (SELECT 
       t.d.value('b:DocPurpose[1]', 'varchar(50)') DocPurpose 
     FROM @XmlData.nodes('Envelope/body/MessageParts/b:ReturnOrderIn') AS t(d))z 
    Print 'MessageID>>>>>>' + @MessageId 
    Print @DocPurpose 

回答

2

<DocPurpose xmlns="">節點是空的命名空間,而不是默認的命名空間。由於我們無法聲明映射空名稱空間URI的前綴,因此請勿在;WITH XMLNAMESPACES塊中聲明default。試試這個方法:

Declare @DocPurpose varchar(50) 
;WITH XMLNAMESPACES 
     ('http://schemas.microsoft.com/dynamics/2011/01/documents/Message' As a, 
     'http://schemas.microsoft.com/dynamics/2008/01/documents/ReturnOrderIn' As b) 

Select @DocPurpose = DocPurpose from 
(
    SELECT t.d.value('DocPurpose[1]', 'varchar(50)') DocPurpose 
    FROM @XmlData.nodes('a:Envelope/a:Body/a:MessageParts/b:ReturnOrderIn') AS t(d) 
)z 

小的事情,但事情,你需要大寫BBody