sql - 'local-name()' 需要单例(或空序列)T-SQL Xquery

标签 sql sql-server xml tsql

这是这两个问题的变体/组合,但我想我已经按照他们的描述做了:

有没有办法在 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/

相关文章:

python - Python 2.7 中的 MySQL STR_TO_DATE "Incorrect date value"

SQL 查找查询结果的大小

sql-server - 美国是字母表中的第一个值

sql-server - visual studio 2008 支持的数据类型

java - XML 到 POJO,反之亦然

php - 检查是否为空

sql-server - SQL 查询 SELECT FROM [来自另一个表的列的值]

java - 如何使用 Jsoup 遍历 XML 标签?

xml - xslt转换

mysql - 我的 SQL 代码有什么问题?它显示错误代码 1064