首页 > 解决方案 > 在 T-SQL XML value() 中使用属性变量的问题

问题描述

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-serverxmltsqlxml-parsing

解决方案


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

推荐阅读