这是这两个问题的变体/组合,但我想我已经按照他们的描述做了:
- Getting element's name in XPATH
- XQuery [value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'
有没有办法在 SQL Server 2016 T-SQL 查询中获取节点的名称?
我想这样做:
select
trcid,
trcXML.value(
'local-name(//*[local-name()="after"][1]/*[1])',
'varchar(32)'
) as XmlTableName,
trcXml,
trcGUID,
trcCorrID
from trace
order by trcId desc
我在层次结构中的每个项目之后明确包含了 [1]
。
Error: XQuery [trace.trcXML.value()]: 'local-name()' requires a singleton (or empty sequence), found operand of type
'element(*,xdt:untyped) *'
示例数据:
<s1:DB2Request xmlns:s1="XYZDB2">
<s1:sync>
<s1:after identityInsert="false">
<s1:PG204AT5>
<s1:ISA06>1975111</s1:ISA06>
etc...
</s1:PG204AT5>
</s1:after>
</s1:sync>
</s1:DB2Request>
我想要表名(这是一个 BizTalk“update-gram”),它位于“after”和 ISA06 元素之间,在本例中为:PG204AT5。
在 xpathtester.com 中测试:local-name(//*[local-name()="after"][1]/* [1])
- 由于某种原因,当我保存它时,XPATH 发生了变化:http://www.xpathtester.com/xpath/2bd602d8fc7aee0484de14bf93f71ef2
最佳答案
再多一组括号就可以根据需要提供一个单例:
DECLARE @t TABLE(s XML);
INSERT INTO @t(s)VALUES(N'<s1:DB2Request xmlns:s1="XYZDB2">
<s1:sync>
<s1:after identityInsert="false">
<s1:PG204AT5>
<s1:ISA06>1975111</s1:ISA06>
<somethingsomething/>
</s1:PG204AT5>
</s1:after>
</s1:sync>
</s1:DB2Request>');
select
s.value(
'local-name((//*[local-name()="after"][1]/*)[1])',
'varchar(32)'
) as XmlTableName
from @t;
结果:
XmlTableName
PG204AT5
关于sql - 'local-name()' 需要单例(或空序列)T-SQL Xquery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59905080/