Как получить значение атрибута в типе данных xml на основе имени параметра в SQL Server 2008 R2? - PullRequest
2 голосов
/ 02 февраля 2012

У меня есть следующий пример xml в столбце типа данных xml:

 <diagnostics CurrentIterationNumber="79" TotalItemsProcessed="37847"
 ItemsProcessedLastIteration="75" ItemsProcessedPerIteration="479" />

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

Я прочитал, что функция .value ожидает строковый литерал, и многие ресурсы в Интернете советуют использовать для этого функцию sql: variable (). Однако у меня остался код, возвращающий фактическое содержимое переменной.

Попытка что-то вроде следующего:

declare @property as varchar(50);
set @property = '@CurrentIterationNumber';

declare @x as xml;
set @x = (select PropertyValues from dbo.tblDiagnosticsSnapshot);
SELECT
    t.c.value('sql:variable("@property")', 'varchar(50)')
FROM
    @x.nodes('/diagnostics') t(c);

1 Ответ

3 голосов
/ 02 февраля 2012

Вы можете использовать /diagnostics/@*, чтобы получить список атрибутов, и сравнить с local-name(), чтобы получить тот, который вам нужен.

declare @x xml 
set @x = '<diagnostics CurrentIterationNumber="79" TotalItemsProcessed="37847"
 ItemsProcessedLastIteration="75" ItemsProcessedPerIteration="479" />'

declare @property as varchar(50);
set @property = 'CurrentIterationNumber';

select @x.value('(/diagnostics/@*[local-name() = sql:variable("@property")])[1]', 'varchar(50)')

Или так, если вы ожидаете список значений вместотолько один, как в вашем примере XML.

select t.c.value('.', 'varchar(50)')
from @x.nodes('/diagnostics/@*[local-name() = sql:variable("@property")]') as t(c)

Примечание: В строке поиска не должно быть @.set @property = 'CurrentIterationNumber';

...