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