Zakładając, że próbujesz filtrować według identyfikatora w XML, masz problem ze składnią, podałeś węzeł główny jako ActivityId zamiast Activity, nie schodzisz do węzła ID, niewłaściwie używasz contains
- i to prawdopodobnie nie jest to, czego chcesz; i ignorujesz przestrzenie nazw.
Spowoduje to znalezienie tylko wierszy, w których kod XML ma określony identyfikator:
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;
Ale ExtractValue od dawna jest przestarzałe, więc zamiast tego powinieneś używać XMLQuery. Lub w tym kontekście prawdopodobnie bardziej sensowne byłoby użycie XMLExists z wartością, którą chcesz osadzić:
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
);
a może bardziej użytecznie jako 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"
);
Jeśli chcesz następnie wyodrębnić określone dane z XML w pasujących wierszach, spójrz na XMLQuery lub XMLTable - ale to osobna kwestia.