Ако приемем, че се опитвате да филтрирате ID в рамките на XML, имате проблем със синтаксиса, предоставили сте основния възел като ActivityId вместо Activity, не се спускате до ID възела, използвате погрешно contains
- и това вероятно не е това, което искате; и пренебрегвате пространствата от имена.
Това ще намери само редове, където XML има конкретен идентификатор:
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 - но това е отделен проблем.