Za předpokladu, že se pokoušíte filtrovat ID v XML, máte problém se syntaxí, zadali jste kořenový uzel jako ActivityId namísto Activity, nesměřujete dolů k ID uzlu, zneužíváte contains
- a to pravděpodobně stejně není to, co chcete; a ignorujete jmenné prostory.
Tím se najdou pouze řádky, kde má XML konkrétní 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;
Ale ExtractValue je již dávno zastaralý, takže byste místo něj měli použít XMLQuery. Nebo v tomto kontextu by pravděpodobně dávalo větší smysl použít XMLExists s hodnotou, kterou chcete vložit:
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
);
nebo možná užitečněji dodané 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"
);
Pokud pak chcete extrahovat konkrétní data z XML v odpovídajících řádcích, podívejte se na XMLQuery nebo XMLTable – ale to je samostatný problém.