【问题标题】:How to retrieve value of attribute in xml datatype based on parameter name in SQL Server 2008 R2?如何根据 SQL Server 2008 R2 中的参数名称检索 xml 数据类型中的属性值?
【发布时间】:2012-02-02 14:11:26
【问题描述】:

我在 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);

【问题讨论】:

    标签: sql sql-server xml xquery-sql


    【解决方案1】:

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

    【讨论】:

    • 谢谢!传奇。我之前遇到过这个解决方案的错误,一定是我在变量中有@的事实
    猜你喜欢
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多