2009-07-31 5 views
9

У меня есть таблица с полем XML. Типичный XML, который он содержит;Работа с типом данных SQL Server 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 строк, я озабочен только с двумя полями, Омид (интермедиат первичный ключ) и omText (мои данные XML).

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

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

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.

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

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

ответ

16

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

Не уверен, что я полностью понял ваш вопрос здесь - или вы ищете это? Вы бы захватить все/вещи/элементы Фруктов «узлы» и крест присоединиться к ним против ваших «баз данных» в 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 

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

Marc

+1

Это ..... Вы звезда. Cheers :) Не думайте, что вы можете указать мне в сторону каких-либо приличных ресурсов для чтения XML-манипуляций SQL ??? – GordonB

+2

Рад, что я могу помочь, Гордон! Лучшая статья SQL XML DML, которую я нашел до сих пор, довольно старая, но по-прежнему очень полезная: http://www.15seconds.com/Issue/050803.htm –

+0

Или это здесь может быть: http://www.sqlservercentral.com/ Статьи/SQL + сервер + 2005/XML / –

Смежные вопросы