Синтаксическая ошибка рядом с переменной, ожидаемое выражение шага в l oop для (XQuery, SQL Server) - PullRequest
0 голосов
/ 20 марта 2020
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>'

Я хочу получить значение атрибута предка B (idB) для каждого тега на 4 уровне (C, D).

Например:

<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>

Я использую XQuery на SQL Сервер:

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", ожидаемое выражение шага

1 Ответ

0 голосов
/ 20 марта 2020

Пожалуйста, попробуйте следующее 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>
...