Ervan uitgaande dat je probeert te filteren op een ID in de XML, je hebt een probleem met de syntaxis, je hebt het hoofdknooppunt opgegeven als ActivityId in plaats van Activity, je gaat niet naar het ID-knooppunt, je misbruikt contains
- en dat is waarschijnlijk toch niet wat je wilt; en je negeert de naamruimten.
Dit zal alleen rijen vinden waar de XML een specifieke ID heeft:
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;
Maar ExtractValue is al lang verouderd, dus u moet in plaats daarvan XMLQuery gebruiken. Of in deze context zou het waarschijnlijk logischer zijn om XMLExists te gebruiken, met de waarde die u wilt insluiten:
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
);
of misschien nuttiger geleverd als argument:
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"
);
Als u vervolgens specifieke gegevens uit de XML wilt extraheren in overeenkomende rijen, kijk dan naar XMLQuery of XMLTable - maar dat is een andere kwestie.