【问题标题】:T-SQL XQuery value of attribute "y" where attribute "x" is known属性“y”的 T-SQL XQuery 值,其中属性“x”已知
【发布时间】:2017-10-06 12:05:33
【问题描述】:

我正在尝试查询无类型 XML 数据的 XML 字段以进入存储过程。

字段有多个同名元素,每个元素有多个属性。查询需要返回 c 的值,其中 r 的值(字段中的唯一值)是已知的。 例如。在下面的 XML 字段中返回属性 c 的值,其中属性 r 的值是“FGH”。 r 的每个值都是唯一的,因此只会返回一行。

<Assets>
    <Cars>
        <Car r="ABC" c="Nissan" t="petrol"/>
        <Car r="FGH" c="VW" t="petrol"/>
        <Car r="XYZ" c="Mini" t="diesel"/>
    </Cars>
</Assets>

我尝试过的查询的编辑版本是:

USE MyDB

DECLARE           
@ASSETS XML = null,
@car nvarchar(50)

SELECT @ASSETS = ASSETS FROM MyTable WHERE ID = 26800
SELECT @car = @ASSETS.value('(//*/*/@FGH', 'nvarchar(max)') ;

我可以看出这是不对的,但完全卡住了。

【问题讨论】:

    标签: xml tsql sql-server-2008-r2


    【解决方案1】:

    所以你想要一个元素(任何名称)上的c 属性的值,该元素的r 属性值为FGH。你想要的 xpath 是:

    //*[@r='FGH']/@c
    

    根据您获取价值的方式,您可能需要显式获取单例值。示例:

    DECLARE @xml xml = '<Assets>
        <Cars>
            <Car r="ABC" c="Nissan" t="petrol"/>
            <Car r="FGH" c="VW" t="petrol"/>
            <Car r="XYZ" c="Mini" t="diesel"/>
        </Cars>
    </Assets>
    ';
    
    SELECT @xml.value('(//*[@r="FGH"]/@c)[1]', 'nvarchar(max)');
    

    结果:

    ----------------------
    VW
    
    (1 row(s) affected)
    

    ( )[1] 是为了让 SQL Server 相信你得到的是一个单一的值。

    【讨论】:

    • 谢谢@AakashM。完美。
    猜你喜欢
    • 1970-01-01
    • 2020-06-13
    • 2018-09-07
    • 2017-09-17
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多