XML内のIDでフィルタリングしようとしていると仮定すると、構文に問題があります。ルートノードをActivityではなくActivityIdとして指定し、IDノードに移動せず、誤用していますcontains
-そしてそれはおそらくあなたが望むものではありません。名前空間を無視しています。
これは、XMLが特定のIDを持つ行のみを検索します:
SELECT * from activity
where ExtractValue(xml,
'/Activity/Agent/Territory/ns2:SalesTeamId/ns2:ID/text()',
'xmlns="urn:astrazeneca:na:Activity:domain:3" xmlns:ns2="urn:astrazeneca:na:CommonTypes:domain:2"'
) = 10669;
ただし、ExtractValueは長い間非推奨になっているため、代わりにXMLQueryを使用する必要があります。または、このコンテキストでは、埋め込みたい値を使用してXMLExistsを使用する方がおそらく理にかなっています:
SELECT * from activity
where XMLExists('
declare default element namespace "urn:astrazeneca:na:Activity:domain:3";
declare namespace ns2="urn:astrazeneca:na:CommonTypes:domain:2";
/Activity/Agent/Territory/ns2:SalesTeamId/ns2:ID[text()=10669]
'
passing xml
);
または、おそらくもっと便利に引数として提供されます:
SELECT * from activity
where XMLExists('
declare default element namespace "urn:astrazeneca:na:Activity:domain:3";
declare namespace ns2="urn:astrazeneca:na:CommonTypes:domain:2";
/Activity/Agent/Territory/ns2:SalesTeamId/ns2:ID[text()=$id]
'
passing xml, 10669 as "id"
);
次に、一致する行のXMLから特定のデータを抽出する場合は、XMLQueryまたはXMLTableを調べますが、これは別の問題です。