Поиск XML столбца в SQL - PullRequest
       30

Поиск XML столбца в SQL

3 голосов
/ 30 марта 2009

У меня есть документ XML для хранения в отношении записей в базе данных Oracle.

Таблица CourseXML будет содержать:

Record_Number  int
XML_Type       int
XMLDoc         clob
...etc

Я хотел бы сделать поиск в столбце XMLDoc по тегам XML. XML-документ имеет следующую XML-схему:

<root>
  <UnitID="2" Name="Jerry" SName="Potter"/>
  <UnitID="3" Name="Jim" SName="Carelyn"/>
</root>

Я хочу сделать поиск по UnitID = "2", и я хочу только строку xml Джерри. Как мне сделать запрос оператора select, чтобы получить эту строку XML?

Ответы [ 4 ]

2 голосов
/ 30 марта 2009

Возможно, вам придется поиграть с битом узлов, чтобы получить его точно.

SELECT
    y.item.value('@UnitID', 'int') AS UnitID,
    y.item.value('@Name', 'varchar(100)') AS [Name],
    y.item.value('@SName', 'varchar(100)') AS [SName]
FROM
    <table>
    CROSS APPLY
    XMLDoc.nodes('/root') AS y(item)
WHERE
    y.item.value('@UnitID', 'int') = 2

Редактировать: исправлен код для использования таблицы, а не локальной переменной xml

2 голосов
/ 31 марта 2009

У вас есть много способов получить это. "gbn" показал один путь - два других здесь.

Если вам нужен весь «ряд» (я предполагал, что вы поместите эти вещи в тег), попробуйте следующее:

select
    xmldoc.query('//node[@UnitID="2"]')
from
    xmltest

Если вам нужен только атрибут «Name» из тега, используйте это:

select
    xmldoc.value('(//node[@UnitID="2"]/@Name)[1]', 'varchar(20)')
from
    xmltest

Если вам нужен доступ ко всей совокупности атрибутов и / или подэлементов, используйте подход gbn с «CROSS APPLY xmldoc.nodes (....)».

Наслаждайтесь! Поддержка XML в SQL Server 2005 действительно достаточно обширна и полезна!

Марк

0 голосов
/ 22 октября 2010

Быть структурой и использовать полнотекстовый поиск.

<Root>
  <Tags>
    <TagName>Actividad</TagName>
    <Valor>Actividad 2</Valor>
  </Tags>
  <Tags>
    <TagName>Cliente</TagName>
    <Valor>Alpina</Valor>
  </Tags>
</Root>
 select 
     Filename
 from 
 Files
 where 
 CONTAINS(Tags,'Actividad')  and
 CONTAINS(Tags,'Cliente')  and
 Tags.exist('//Tags/Valor/text()[contains(., "Actividad 1")]')  = 1 and
 Tags.exist('//Tags/Valor/text()[contains(., "ADV")]')  = 1

Я не рекомендую использовать атрибуты в XML, поскольку полнотекстовый поиск по атрибутам не может быть выполнен (независимо от того, что написано в Документах по SQL 2008 R2).

Пожалуйста, обратитесь к этому

0 голосов
/ 30 марта 2009
SELECT * FROM CourseXML
WHERE XMLDoc = 'UnitID="2"'

Не правда ли? Или я что-то недопонимаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...