Förutsatt att du försöker filtrera på ett ID i XML, du har ett problem med syntax, du har angett rotnoden som ActivityId istället för Activity, du går inte ner till ID-noden, du missbrukar contains
- och det är nog inte det du vill ändå; och du ignorerar namnområdena.
Detta kommer bara att hitta rader där XML har ett specifikt 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;
Men ExtractValue har föråldrats sedan länge, så du bör använda XMLQuery istället. Eller i det här sammanhanget skulle det förmodligen vara mer meningsfullt att använda XMLExists, med det värde du vill ha inbäddat:
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
);
eller kanske mer användbart som ett 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"
);
Om du sedan vill extrahera specifik data från XML i matchande rader, titta på XMLQuery eller XMLTable - men det är en separat fråga.