ashu1810 Ответов: 1

Как прочитать XML-узел из SQL-запроса


нужно извлечь записи на основе формы Ref ID, которая есть в XML-данных.
пожалуйста, помогите мне с sql - запросом

<FormTest xmlns="xyz">
  <NewForm xmlns:a="abc">
    <a:Attachments />
    <a:Comment i:nil="true" />
    <a:FormRef xmlns:b="test">
      <b:Id>36134fe3-9826-4c1d-bb79-13dcfda9e976</b:Id>
      <b:Name>test form</b:Name>
      <b:FormMasterId>00000000-0000-0000-0000-000000000000</b:FormMasterId>
      <b:FormRefId>00000000-0000-0000-0000-000000000000</b:FormRefId>
      <b:Type>known</b:Type>
      <b:Version xmlns:c="system" i:nil="true" />
    </a:FormRef>
  </NewForm>
</FormTest>


Что я уже пробовал:

SELECT * FROM Events
CROSS APPLY  [Body].nodes('//*:FormRef/Id') T(c) 
where  T.c.value('.', 'uniqueidentifier') = 'E0FEAF8D-912C-4B0F-84A9-60E6C5C1EDE2'

1 Ответов

Рейтинг:
10

Richard Deeming

Ваш XML содержит несколько пространств имен. Вы должны включить их в свой запрос:

WITH XMLNAMESPACES 
(
    'xyz' as ns1,
    'abc' as a,
    'test' as b
)
SELECT Events.* 
FROM Events
CROSS APPLY [Body].nodes('//a:FormRef/b:Id') T(c) 
where  T.c.value('.', 'uniqueidentifier') = 'E0FEAF8D-912C-4B0F-84A9-60E6C5C1EDE2';

Добавление пространств имен в запросы с помощью XMLNAMESPACES | Microsoft Docs[^]

NB: Я предполагаю, что XML - это фрагмент более крупного документа. Если это не так, то это недопустимо - префикс "i" нигде не объявлен.


ashu1810

ты прав, Ричард, это более крупный док. спасибо Вам за это решение