2016-12-01 114 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