Я пытаюсь получить все строки из таблицы, которые зависят от содержимого столбца XML. Плюс тот факт, что содержимое соответствует шаблону.
Макет моей таблицы может выглядеть примерно так:
|Id |Name|Designation|XML |
| 1 |Abc |Ghi |...|
| 2 |Def |Jkl |...|
Предположим, что содержимое столбца XML может быть следующим:
<Root>
<Node1>
<SubNode1 />
<SubNode2 />
</Node1>
<Node2>
<SubNode3 property="Something">
...
</SubNode3>
<SubNode3 property="Reference.Object(abcdef12345 (1)).Value">
...
</SubNode3>
<SubNode3 property="SomethingElse">
...
</SubNode3>
</Node2>
</Root>
Теперь предыдущий XML является содержимым столбца XML, но свойство, которое мы ищем, может находиться в первом или третьем SubNode3. Цель состоит в том, чтобы получить все строки, которые содержат свойство node / Root / Node2 / SubNode3 / @, которое содержит «Reference.Object (ab * (1)). НО число между () может быть другим. Здесь это 1, но может быть другим числом. Я написал *, чтобы сказать, что текст может быть любым другим, но не начинаться с "ab".
Я пробовал (среди прочего ...) вот что:
WITH XMLNAMESPACES(DEFAULT 'http://schemas.mycompany.com/validation.xsd')
SELECT *
from [MySchema].[MyTable]
where XML.exist('/Root/Node2/SubNode3/@property[contains(.,"Reference.Object") and contains(.,("(1)"))]') = 1;
Но здесь проблема в том, что я не знаю, как сказать, что в (1) 1 может быть другим числом, и эта строка между первой круглой скобкой в свойстве атрибута начинается с «ab» и может содержать что угодно.
Я также пытался использовать xquery.value, чтобы иметь возможность использовать синтаксис LIKE, но проблема в том, что (возможно, я что-то пропустил) значение использует конкретный узел c, я имею в виду индексированный до [1], поэтому он искал первый SubNode3, а не остальные.