2016-12-01 201 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'的解決方案是可以的,但如果你只改變了....節點('/ *:BusinessEvent ...')來通配最外層節點的名字空間。一個提示:如您想獲得*從客戶端塊*內的所有元素的數據,你應該停止'XPath'在'.nodes()'客戶端後,讀取與'c.value(「CLID [每個元素1]」, '爲nvarchar(最大)')'。這允許你使用相同的'CROSS APPLY'來處理所有的內部元素。 – Shnugo

回答

3

由於命名空間是的根元素,因而不會適用於整個 XML文檔,你不能把它定義爲您的T-SQL代碼中的「默認」的命名空間 - 你必須是具體的:

;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) 

<BusinessEvent>元素是是XML命名空間的不部分 - 但如果你將其定義爲在DEFAULT命名空間的T-SQL語句,在您的XPath定義的默認命名空間將被應用到你的XML元素的所有 - 這樣的<BusinessEvent>頂級節點是匹配....

+0

與命名空間相得益彰,從我身邊+1。我認爲,'XPath'不應該放在'ns:ClID'上,而應該在'ns:Client'後面停止,以便一次性處理內部元素(請參閱我對OP的評論)。 – Shnugo