SQL Server для XML-пути с двойными элементами
Я пытаюсь создать вывод XML в SQL Server 2012, используя FOR XML PATH.
Что можно сделать, чтобы получить желаемый результат?
Я хотел бы вывести:
<types>
<type>
<type>FirstType</type>
<attribute>FirstAttribute</attribute>
</type>
</types>
<types>
<type>
<type>SecondType</type>
<attribute>SecondAttribute</attribute>
</type>
</types>
<types>
<type>
<type>ThirdType</type>
<attribute>ThirdAttribute</attribute>
</type>
</types>
Мой код:
DECLARE @table TABLE (
type VARCHAR(50)
, attribute VARCHAR(50)
)
SELECT T1.type
, T1.attribute
FROM @table AS T1
FOR XML path('type'), root('types')
Дает мне неправильный вывод:
<types>
<type>
<type>FirstType</type>
<attribute>FirstAttribute</attribute>
</type>
<type>
<type>SecondType</type>
<attribute>SecondAttribute</attribute>
</type>
<type>
<type>ThirdType</type>
<attribute>ThirdAttribute</attribute>
</type>
</types>
2 ответа
Решение
Это возвращает то, что вы хотите:
DECLARE @table TABLE (
[type] VARCHAR(50)
, attribute VARCHAR(50)
)
INSERT INTO @table VALUES('FirstType','FirstAttribute')
,('SecondType','SecondAttribute')
SELECT T1.type AS [type/type]
, T1.attribute AS [type/attribute]
FROM @table AS T1
FOR XML path('types');
Но будьте осторожны: он недействителен из-за отсутствия корневого узла. XML-движок SQL-Server может справиться с этим, но другие движки могут выйти из строя...
Я думаю, что SQL Server не так строг, поскольку - очень часто - XML состоит из нескольких фрагментов. И таким результатом может стать один из этих фрагментов без проблем...
Я хотел бы вывести:
<types> <type> <type>FirstType</type> <attribute>FirstAttribute</attribute> </type> </types> <types> <type> <type>SecondType</type> <attribute>SecondAttribute</attribute> </type> </types> <types> <type> <type>ThirdType</type> <attribute>ThirdAttribute</attribute> </type> </types>
Ваш желаемый вывод - это даже не правильно сформированный XML:
XML Parsing Error: junk after document element
Location: https://www.w3schools.com/xml/xml_validator.asp
Line Number 7, Column 1:
<types>
^
Вы не можете иметь несколько корневых элементов.