2010-09-13 4 views
3

Я пытаюсь запросить определенное значение в поле XML. Я видел много примеров, но они, кажется, не то, что я ищуSQL Server 2005 - поиск значения в поле XML

Предположив мой XML поле называется XMLAttributes и таблицы TableName, и полное значение XML, как ниже:

<Attribute name="First2Digits" value="12" /> 
<Attribute name="PurchaseXXXUniqueID" value="U4RV123456762MBE79" /> 

(хотя поле XML часто будет иметь другие атрибуты, а не только PurchaseXXXUniqueID)

Если я ищу для определенного значения в PurchaseXXXUniqueID имя атрибута - говорят U4RV123456762MBE79 - как бы я написать запрос? Я считаю, что это будет что-то вроде:

select * 
    from TableName 
where XMLAttributes.value('(/path/to/tag)[1]', 'varchar(100)') = '5FTZP2QT8Z3E2MAV2D' 

... но это путь/к/тег, который мне нужно выяснить.

Возможно, есть другие способы получить значения, которые я хочу.

Подводя итог - мне нужно получить все записи в таблице, где значение определенного атрибута в поле xml соответствует значению, которое я передам в запрос.

благодарит за помощь! Sylvia

Редактировать: Я пытался сделать это проще, но в случае, если это имеет значение - в конечном итоге у меня будет временная таблица из 50 или около того потенциальных значений для поля PurchaseXXXUniqueID. Для этого я хочу получить все соответствующие записи из таблицы с полем XML.

ответ

1

Это должно работать:

SELECT 
    (fields from base table), 
    Nodes.Attr.value('(@name)[1]', 'varchar(100)'), 
    Nodes.Attr.value('(@value)[1]', 'varchar(100)') 
FROM 
    dbo.TableName 
CROSS APPLY 
    XMLAttributes.nodes('/Attribute') AS Nodes(Attr) 
WHERE 
    Nodes.Attr.value('(@name)[1]', 'varchar(100)') = 'PurchaseXXXUniqueID' 
    AND Nodes.Attr.value('(@value)[1]', 'varchar(100)') = 'U4RV123456762MBE79' 

Вы в основном должны присоединиться ряд базовой таблицы против одного «псевдо-строки» для каждой из <Attribute> узлов внутри колонны XML, и выбрать отдельные значения атрибутов от узла <Attribute>, чтобы выбрать то, что вы ищете.

+0

Это сделало - спасибо! Тем не менее, это было очень медленно. Не то, чтобы медленная производительность была проблемой с вашим запросом, просто эти таблицы не настроены для запросов XML. Если бы у меня был весь список идентификаторов, которые я хочу найти, они помещали их в временную таблицу, а затем присоединяли бы их примерно так: – Sylvia

+0

на Nodes.Attr.value ('(@ value) [1]', 'varchar (100) ') = # tempTable.UniqueID ...... – Sylvia

+0

быть способ сделать это (извините, cr/lf в конечном итоге стал новым) – Sylvia

0

Что-то в этом роде?

declare @PurchaseXXXUniqueID varchar(max) 
set @PurchaseXXXUniqueID = 'U4RV123456762MBE79'; 

select * from TableName t 
where XMLAttributes.exist('//Attribute/@value = sql:variable("@PurchaseXXXUniqueID")') = 1 
+0

Благодарим за отзыв. Я не мог получить что-то подобное этому, чтобы работать в sql 2005 - используется ли это синтаксис 2008 года? – Sylvia

+0

Ну, единственная разница в выражении 'declare'. Просто отделите часть декларации от части назначения. –

+0

Я сделал это, и он работает без ошибок ... но он, похоже, не отфильтровывает только те значения, которые я хочу. Я получаю все значения. – Sylvia

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