我是SQL和XML的新手。我的目标是从客户端块中获取所有元素的数据,但SELECT不返回任何数据。没有命名空间,查询就可以工作。
你能帮忙吗?
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 :(得分: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命名空间的一部分 - 但如果您在T-SQL语句中将其定义为DEFAULT
命名空间,则该默认命名空间将为应用于XPath中定义的所有 XML元素 - 因此<BusinessEvent>
顶级节点 NOT 匹配....