Работа с типом данных SQL Server XML - PullRequest
9 голосов
/ 31 июля 2009

У меня есть таблица с полем XML.Типичный XML-файл, который он содержит:

<things>
  <Fruit>
    <imageId>39</imageId>
    <title>Apple</title>
  </Fruit>
  <Fruit>
    <imageId>55</imageId>
    <title>Pear</title>
  </Fruit>
  <Fruit>
    <imageId>76</imageId>
    <title>Grape</title>
  </Fruit>
</things>

В моей таблице содержится около 50 строк, меня интересуют только два поля: omId (первичный ключ int) и omText (мои данные xml).

То, что я пытаюсь достичь, это способ сказать, по всем данным XML во всей таблице ... дать мне все элементы xmlElements, гденазвание X. Или подскажите все элементы, которые используют imageId 55.

Я использую функции типа данных VALUE и QUERY для получения данных.

   select omID,
   omText.query('/things/Fruit')
   ,cast('<results>' + cast(omText.query('/things/Fruit') as varchar(max)) + '</results>' as xml) as Value
   from dbo.myTable
   where omText.value('(/things/Fruit/imageId)[1]', 'int') = 76

Который работает только тогда, когда идентификатор, который я ищу, является первым в документе.Кажется, он не ищет весь XML.

По сути, набор результатов возвращается с одной строкой для каждой записи в ТАБЛИЦЕ, тогда как я думаю, что мне нужно иметь одну строку для каждого совпадающего ЭЛЕМЕНТА ... Не совсем уверен, как начать писать группу дляtho.

Я начинаю чувствовать, что я делаю это сложнее, чем нужно ... мысли и идеи, пожалуйста.

1 Ответ

16 голосов
/ 31 июля 2009

То, что я пытаюсь достичь, это способ сказать, во всех данные XML во всей таблице ... дайте мне все элементы xmlElements где заголовок X.

Не уверен, что я полностью понял ваш вопрос здесь - или вы ищете это? Вы бы взяли все элементы / things / Fruit в «узлы» и перекрестно соединили их со своими «базовыми данными» в myTable - в результате вы получите одну строку на элемент XML в вашем поле данных XML:

select 
   omID,
   T.Fruit.query('.')
from 
   dbo.myTable
cross apply
   omText.nodes('/things/Fruit') as T(Fruit)
where 
   T.Fruit.value('(title)[1]', 'varchar(50)') = 'X'

Или подскажите все элементы, которые используют imageId 55.

select 
   count(*)
from 
   dbo.myTable
cross apply
   omText.nodes('/things/Fruit') as T(Fruit)
where 
   T.Fruit.value('(imageId)[1]', 'int') = 55

Это то, что вы ищете?

Марк

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