2016-12-01 8 views
2

私はSQLとXMLの初心者です。私の目的は、クライアントブロック内のすべての要素からデータを取得することですが、SELECTはデータを返しません。名前空間がなければ、クエリは機能します。名前空間でXMLからデータを選択

お手伝いできますか?

DECLARE @x XML='<BusinessEvent Name="FO.Client"> 
      <ClientMessage xmlns="http://www.fwbs.net/Aderant.BO.Integration/FO.MessageTypes.xsd"> 
       <OriginatingProcessIdentity></OriginatingProcessIdentity> 
       <Operation></Operation> 
       <IsDataIncluded></IsDataIncluded> 
       <Clients> 
        <Client> 
         <GlobalId></GlobalId> 
         <ClID>g</ClID> 
         <No></No> 
         <Type></Type> 
         <Name></Name> 
         <BrCode></BrCode> 
         <Created></Created> 
         <FeeUsrID></FeeUsrID> 
         <DefaultAddID></DefaultAddID> 
         <ContID></ContID> 
        </Client> 
       </Clients> 
      </ClientMessage> 
     </BusinessEvent>' 


    ;WITH XMLNAMESPACES 
     (DEFAULT 'http://www.fwbs.net/Aderant.BO.Integration/FO.MessageTypes.xsd')   
     SELECT TOP 10 cl.c.value('(text())[1]', 'varchar(20)') clid 
    FROM (SELECT @x data) data 
    CROSS APPLY [data].nodes('/BusinessEvent/ClientMessage/Clients/Client/ClID') AS cl(c) 
+0

回答@marc_sは、あなたが助けましたあなたがネームスペースを持っていれば(あなたのソリューションは 'DEFAULT'でOKでしたが、' .... nodes( '/ *:BusinessEvent ... 'だけを変更して、最も外側のノードの名前空間をワイルドカードしました) 1つのヒント:クライアントブロック*内のすべての要素からデータを取得したいので、クライアントの後に '.nodes()'の 'XPath'を' c.value( 'ClID [ 1] '、' nvarchar(max) ') 'と入力します。これにより、同じ 'CROSS APPLY'を使ってすべての内部要素に対処することができます。 – Shnugo

答えて

3

名前空間は、ルート要素にないであり、したがって、全体 XMLドキュメントには適用されません、あなたはあなたのT-SQLコード内の「デフォルト」の名前空間として定義することはできませんので、 <BusinessEvent>要素は、そのXML名前空間のない一部である

;WITH XMLNAMESPACES ('http://www.fwbs.net/Aderant.BO.Integration/FO.MessageTypes.xsd' AS ns)   
SELECT TOP 10 
    cl.c.value('(text())[1]', 'varchar(20)') clid 
FROM 
    @x.nodes('/BusinessEvent/ns:ClientMessage/ns:Clients/ns:Client/ns:ClID') AS cl(c) 

- しかし、あなたはあなたの中にDEFAULTネームスペースとしてそれを定義した場合: - あなたは、特定する必要がありますT-SQLステートメントは、あなたのXPathで定義されているデフォルトの名前空間は、あなたのXML要素のすべてに適用されます - ....そう<BusinessEvent>トップレベルのノードはませ一致ある

+0

ネームスペースの良いキャッチ、私の側から+1。私は、 'XPath'は' ns:ClID'に落ちるのではなく、 'ns:Client'の後で止まって一度に内側の要素を手に入れるべきだと思っています。 – Shnugo

関連する問題