Запрос столбцов 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, но это никогда не будет так же хорошо, как правильно проиндексированные реляционные данные. Если вы выбираете один документ, а затем запрашиваете только внутри этого, вы можете делать это довольно хорошо, но когда ваш запрос должен сканировать кучу похожих документов в поисках чего-либо, это похоже на поиск ключа в плане реляционных запросов (то есть медленно).