Я пытаюсь создать 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 Dave28 Я тоже пробовал, и они работают.
Проблема в том, что вы используете несколько имен узлов в своем псевдониме. В результате ''
без псевдонима означает ''
на корневом уровне; таким образом, вы выходите из любых других узлов (в данном случае 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.
Существует другой, лучший способ создания 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>
Это очень здорово!
Вы говорите «лучше»; чем этот метод лучше? Можете ли вы уточнить?
@ThomA, это «визуальная» простота композиции XML по сравнению с не столь очевидным SELECT ... FOR XML PATH...
утверждением. Кроме того, псевдоним имеет ограничение по длине до 128 символов. Итак, когда XML глубоко вложен и имеет префиксы пространства имен, он вообще не работает.
Да, я вижу, что визуально он отличается, но что делает его «лучше»? Например, стал ли синтаксис более производительным?
возможный дубликат SQL FOR XML для создания нескольких узлов с одинаковыми именами