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
函数。
在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