Как сделать выбор на основе содержимого столбца XML с подстановочным знаком - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь получить все строки из таблицы, которые зависят от содержимого столбца 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, а не остальные.

...