在T-SQL XML value()中使用属性变量的问题

问题描述 投票:0回答:1
    DECLARE @NodePath VARCHAR(20) = 'C',
            @NodeVariable VARCHAR(20) = '@name',
            @result XML;
    SET @result = '
    <A>
        <B>
            <C name="Name01"/>
        </B>
        <B>
            <C name = "Name02"/>
        </B>
    </A>
    '
    SELECT T.c.value('sql:variable("@NodeVariable")', 'VARCHAR(20)')
    FROM @result.nodes('//*[local-name()=sql:variable("@NodePath")]') T(c)

我想获取XML的属性,例如:

|Name|
|Name01|
|Name02|

但是结果是:

|Name|
|@name|
|@name|

如何解决该问题?由于我想创建一个以路径和属性名称作为参数的函数,因此不允许使用OPENXML函数。

sql-server xml tsql xml-parsing
1个回答
1
投票

value()功能中,您需要使用@*[local-name()=...]语法,例如:

declare @NodePath nvarchar(20) = 'C';
declare @NodeVariable nvarchar(20) = 'name';
declare @result xml =
N'<A>
    <B>
        <C name="Name01"/>
    </B>
    <B>
        <C name = "Name02"/>
    </B>
</A>'
select x.n.value('(@*[local-name()=sql:variable("@NodeVariable")])[1]', 'nvarchar(20)') as 'Name'
from @result.nodes('//*[local-name()=sql:variable("@NodePath")]') x(n)

哪个产量:

Name
------
Name01
Name02
© www.soinside.com 2019 - 2024. All rights reserved.