sql-server - 在 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
函数,因此不允许使用函数。
解决方案
在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
推荐阅读
- c++ - DirectX SDK 2010 年 6 月:XAudio2 在每次应用退出时崩溃
- react-native - 在反应本机redux中将对象连接到数组中
- javascript - 使用 jest 模拟和取消模拟命名导入
- c# - 代码不起作用,我不明白为什么
- python - RegEx 用于匹配除一些特殊字符和“:)”之外的所有字符
- angularfire2 - 如何使用 angularfire 查询引用?
- javascript - 如何让 HTML 模板和 Vue 一样定义 React 组件?
- c++ - 如何创建自定义注释,如 Boost DI 命名注释
- android - 泛型的 Kotlin MVP 实现问题
- eclipse - 通过 Xtext 使用 Sirius 建模的教程