2010-02-16 4 views
3

Возьмите следующие 4 Пример XML документы:Использование XQuery в SQL Server 2008 для поиска содержимого

  1. < Пример > < Цвет > оранжевый </Цвет > </Пример >

  2. < Пример > < Автомобиль цвет = "оранжевый" > Форд Фокус </Автомобиль > </Пример >

  3. < Пример > <County> Orange County </County > </Пример >

  4. < Пример > < Оранжевый/Orange > </Пример >

Они все хранятся в базе данных SQL Server в таблице с типом данных XML-столбца (нетипизированного).

Как бы я идти о запуске запроса ищет все содержимое документа со словом оранжевого цвета в нем, что будет возвращать следующие документы:

  1. это имеет значение оранжевый внутри элемента.
  2. У этого значения есть значение апельсин внутри атрибута.
  3. это имеет значение Orange County внутри элемента (обратите внимание на другую оболочку слова Orange)

Документ-не должен быть возвращен в результатах запроса, как слово апельсин имя элемента и не данные стоимость.

Возможно ли это?

Заранее спасибо.

ответ

2

Я не думаю, что вы можете сделать это в одном запросе - однако, с двумя, вы должны получить результаты, которые вы ищете:

  1. первый запрос, чтобы получить все узлы XML, которые содержат текст (внутри элемента), который выглядит как «оранжевые»:

    SELECT * FROM dbo.XQueryTest 
    WHERE XmlContent.value('(//*/text())[1]', 'varchar(50)') LIKE '%orange%' 
    
  2. второго запроса, чтобы сделать то же самое, но на основании значения атрибута:

    SELECT * FROM dbo.XQueryTest 
    WHERE XmlContent.value('(//*/@*)[1]', 'varchar(50)') LIKE '%orange%' 
    

Запрос 1 просто захватывает значение text() для всех узлов XML как строку (varchar(50)) и сравнивает это на основе регулярного синтаксиса SQL с «% orange%».

№ запроса. 2 возьмите все значения атрибутов (/@*) и сделайте то же самое.

Конечно, вы можете UNION эти два вместе, если вам действительно нужно.

Надеюсь, это поможет!

+0

Привет, спасибо, что работает, однако он работает только если есть один узел в дочерний узел, как бы я искать узлов и значения атрибутов, если Пример корневой узел содержит несколько дочерних узлов: <Автомобиль цвет =» оранжевый "> Ford Focus оранжевый Orange County

+1

нормально, после добавления этого запроса примерно через 2 часа в поисках ответа я тогда вернулся к более погуглить для ответа на этот I нашел это: SELECT * FROM dbo.XQueryTest WHERE XmlContent.exist ('// */text() [содержит (., "Orange")]') = 1 –

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