Использование XQuery в SQL Server 2008 для поиска контента - PullRequest
3 голосов
/ 16 февраля 2010

Возьмите следующие 4 примера XML-документов:

  1. оранжевый

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

  3. Оранжевый Область

  4. 555

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

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

  1. внутри элемента значение оранжевого цвета.
  2. внутри атрибута есть значение orange.
  3. это значение имеет значение Orange County внутри элемента (обратите внимание на другой регистр слова Orange)

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

Возможно ли это вообще?

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

1 Ответ

2 голосов
/ 16 февраля 2010

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

  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 эти два вместе, если вам действительно нужно.

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

...