如何根据SQL Server 2008 R2中的参数名称检索xml数据类型中的属性值?

时间:2012-02-02 14:11:27

标签: sql sql-server xml xquery-sql

我在xml数据类型的列中有以下示例xml:

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

我希望有一个存储过程,我可以传入要查询的属性名称。然后,我想将其值存储到变量中以执行另一组计算。

我已经读过.value函数需要一个字符串文字,并且Web上的许多资源都建议使用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 个答案:

答案 0 :(得分:3)

您可以使用/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';