Два элемента с одинаковым именем для пути xml()

Я пытаюсь создать XML с использованием T-SQL (SQL Server 2019) с двумя элементами с одинаковым именем. Я уже провел некоторое исследование и нашел обходной путь, но результат все еще не тот, на который я надеюсь. .

Это то, что я пробовал до сих пор:

select
'A' as [Test/Route/Client/value],
'',
'B' as [Test/Route/Client/value]
for xml path('test'), type

Это обходной путь, о котором я читал (с его помощью вы можете создать новый узел с теми же именами):

'',

Но проблема в том, что результат такой:

<test>
  <Test>
    <Route>
      <Client>
        <value>A</value>
      </Client>
    </Route>
  </Test>
  <Test>
    <Route>
      <Client>
        <value>B</value>
      </Client>
    </Route>
  </Test>
</test>

и мой желаемый результат был бы таким:

<test>
  <Test>
    <Route>
      <Client>
        <value>A</value>
        <value>B</value>
      </Client>
    </Route>
  </Test>
</test>

Есть ли способ сделать это (по сути, это массив)?

нет, решение мне не подходит, я уже попробовал

Dave28 28.08.2024 10:39

Не создавайте вложенную структуру вручную, вместо этого используйте подзапросы. Также укажите данные, с которыми вы работаете.

siggemannen 28.08.2024 10:41

@Dave28 Dave28 Я тоже пробовал, и они работают.

GSerg 28.08.2024 10:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема в том, что вы используете несколько имен узлов в своем псевдониме. В результате '' без псевдонима означает '' на корневом уровне; таким образом, вы выходите из любых других узлов (в данном случае Client, Route и Test). Чтобы использовать метод, который вы используете, вам нужно сообщить SQL Server, что пустая строка принадлежит вашему узлу Client:

SELECT 'A' AS [Test/Route/Client/value],
       '' AS [Test/Route/Client],
       'B' AS [Test/Route/Client/value]
FOR XML PATH('test'), TYPE;

В противном случае вы можете создать свой XML с помощью подзапросов. Например:

SELECT (SELECT 'A' AS value, '',
               'B' AS value
        FOR XML PATH('Client'), ROOT('Route'), TYPE)
FOR XML PATH('Test'), ROOT('test'), TYPE;

это действительно работает. Спасибо за помощь, Зиггеманнен.

Dave28 28.08.2024 11:21

Меня зовут Том, @Dave28.

Thom A 28.08.2024 11:24

Существует другой, лучший способ создания XML для вашего сценария.

Это позволяет делать это «визуально» с помощью вычисляемых конструкторов в XQuery SQL Server.

При необходимости значения «A» и «B» можно получить из переменных T-SQL, а не жестко запрограммировать.

SQL

SELECT CAST(N'' AS XML).query('
    element test {
        element Test {
            element Route {
                element Client {
                    element value {"A"},
                    element value {"B"}
    }}}}
');

Выход

<test>
  <Test>
    <Route>
      <Client>
        <value>A</value>
        <value>B</value>
      </Client>
    </Route>
  </Test>
</test>

Это очень здорово!

siggemannen 28.08.2024 15:58

Вы говорите «лучше»; чем этот метод лучше? Можете ли вы уточнить?

Thom A 28.08.2024 19:04

@ThomA, это «визуальная» простота композиции XML по сравнению с не столь очевидным SELECT ... FOR XML PATH... утверждением. Кроме того, псевдоним имеет ограничение по длине до 128 символов. Итак, когда XML глубоко вложен и имеет префиксы пространства имен, он вообще не работает.

Yitzhak Khabinsky 28.08.2024 19:09

Да, я вижу, что визуально он отличается, но что делает его «лучше»? Например, стал ли синтаксис более производительным?

Thom A 28.08.2024 19:10

Другие вопросы по теме