Hvis du antager, at du forsøger at filtrere på et ID i XML, har du et problem med syntaks, du har leveret rodnoden som ActivityId i stedet for Activity, du går ikke ned til ID-noden, du misbruger contains
- og det er vel alligevel ikke det, du ønsker; og du ignorerer navneområderne.
Dette vil kun finde rækker, hvor XML'en har et 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 længe været forældet, så du bør bruge XMLQuery i stedet. Eller i denne sammenhæng ville det nok give mere mening at bruge XMLExists med den værdi, du ønsker indlejret:
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 måske mere nyttigt leveret som et 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"
);
Hvis du så vil udtrække specifikke data fra XML i matchende rækker, så se på XMLQuery eller XMLTable - men det er et separat problem.