SQL Server 2005 - поиск значения в поле XML - PullRequest
3 голосов
/ 13 сентября 2010

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

Предположим, мое поле xml называется XMLAttributes и table TableName, а полное значение xml выглядит следующим образом:

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

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

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

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

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

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

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

спасибо за помощь!Сильвия

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

Ответы [ 2 ]

1 голос
/ 13 сентября 2010

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

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 голосов
/ 13 сентября 2010

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

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

select * from TableName t
where XMLAttributes.exist('//Attribute/@value = sql:variable("@PurchaseXXXUniqueID")') = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...