Запрос столбцов XML в SQLServer 2005

В таблице "Контакты" моей компании есть поле. В этой таблице есть столбец типа XML. Столбец содержит разные данные о конкретном контакте. НАПРИМЕР.

<contact>
<refno>123456</refno>
<special>a piece of custom data</special>
</contact>

Теги ниже contact может быть разным для каждого контакта, и я должен запросить эти фрагменты вместе со столбцами реляционных данных в той же таблице.

Я использовал такие конструкции, как:

SELECT c.id AS ContactID,c.ContactName as ForeName,
c.xmlvaluesn.value('(contact/Ref)[1]', 'VARCHAR(40)') as ref,    
INNER JOIN ParticipantContactMap pcm ON c.id=pcm.contactid 
AND pcm.participantid=2140
WHERE xmlvaluesn.exist('/contact[Ref = "118985"]') = 1

Этот метод работает нормально, но для ответа сервера требуется некоторое время. Я также исследовал использование функции node () для синтаксического анализа XML-узлов и exist() для проверки, содержит ли узел значение, которое я ищу.

Кто-нибудь знает лучший способ запроса столбцов XML?

5 ответов

Решение

Я обнаружил, что лучшие практики msdn xml для работы со столбцами блобов xml могут послужить источником вдохновения... http://msdn.microsoft.com/en-us/library/ms345115.aspx

Если вы выполняете одну запись и много операций чтения, возьмите удар разбора во время записи и перенесите эти данные в какой-нибудь формат, более подходящий для запросов. Первым предложением было бы разобрать их в связанную, но отдельную таблицу со столбцами name/value/contactID.

Попробуй это

SELECT * FROM Conversionupdatelog ГДЕ конвертировать (XML,colName).value('(/lead /lead/@LeadID=''xyz@airproducts.com'')[1]', 'varchar(max)')='true'

Если у вас есть XSD для вашего Xml, вы можете импортировать его в свою базу данных и затем создать индексы для своих данных Xml.

В дополнение к странице, упомянутой @pauljette, на этой странице есть хороший совет по оптимизации производительности:

http://msdn.microsoft.com/en-us/library/ms345118.aspx

Вы можете многое сделать для ускорения производительности запросов XML, но это никогда не будет так же хорошо, как правильно проиндексированные реляционные данные. Если вы выбираете один документ, а затем запрашиваете только внутри этого, вы можете делать это довольно хорошо, но когда ваш запрос должен сканировать кучу похожих документов в поисках чего-либо, это похоже на поиск ключа в плане реляционных запросов (то есть медленно).

Другие вопросы по тегам