首页 > 解决方案 > 变量附近的语法错误,预期循环中的步骤表达式(XQuery,SQL Server)

问题描述

DECLARE @x xml = 
'<A>
    <B name="235">
        <A1>
            <C id="1.1"/>
            <D id="1.2" />
        </A1>
    </B>
    <B name="535">
        <A1>
            <C id="2.1"/>
            <D id="2.2" />
        </A1>
    </B>   
</A>'

我想为 4 级(C,D)上的每个标签获取祖先 B(idB)的属性值。

例如:

<node tag="C">
  <id>1.1</id>
  <idB>235</idB>
</node>
<node tag="D">
  <id>1.2</id>
  <idB>235</idB>
</node>
<node tag="C">
  <id>2.1</id>
  <idB>535</idB>
</node>
<node tag="D">
  <id>2.2</id>
  <idB>535</idB>
</node>

我在 SQL Server 中使用 XQuery:

SELECT @x.query('for $b in /A/B/A1/*
                 return
                    <node tag="{local-name($b)}">   
                        <id>{data($b/@*[1])}</id>
                        <idB>{data(//logu[.//$b]/@*[1])}</idB>
                    </node>
        ')

但我得到一个错误;

“$b”附近的语法错误,需要一个步骤表达式

标签: sql-serverxmltsqlxquery

解决方案


请尝试以下 XQuery。

SQL

DECLARE @x xml = 
N'<A>
    <B name="235">
        <A1>
            <C id="1.1"/>
            <D id="1.2" />
        </A1>
    </B>
    <B name="535">
        <A1>
            <C id="2.1"/>
            <D id="2.2" />
        </A1>
    </B>   
</A>';

SELECT @x.query('
    for $b in /A/B/A1/*
    return <node tag="{local-name($b)}">   
            <id>{data($b/@*[1])}</id>
            <idB>{data($b/../../@name)}</idB>
        </node>
');

输出

<node tag="C">
  <id>1.1</id>
  <idB>235</idB>
</node>
<node tag="D">
  <id>1.2</id>
  <idB>235</idB>
</node>
<node tag="C">
  <id>2.1</id>
  <idB>535</idB>
</node>
<node tag="D">
  <id>2.2</id>
  <idB>535</idB>
</node>

推荐阅读