Запрос столбцов XML в SQLServer 2005 - PullRequest
3 голосов
/ 09 сентября 2008

В таблице "Контакты" моей компании есть поле. В этой таблице есть столбец типа 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 ]

3 голосов
/ 09 сентября 2008

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

1 голос
/ 09 сентября 2008

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

0 голосов
/ 30 января 2014

Попробуйте это

ВЫБРАТЬ * ИЗ ОБНОВЛЕНИЯ ОБНОВЛЕНИЯ ГДЕ convert (XML, colName) .value ('(/ lead / lead / @ LeadID =' 'xyz@airproducts.com' ') [1]', 'varchar (max)') = 'true'

0 голосов
/ 13 сентября 2008

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

0 голосов
/ 09 сентября 2008

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

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

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

...