Предложение ORDER BY в FOR FOR EXPLICIT
У меня довольно большой запрос (25 тегов в дюжине таблиц; ~1500 строк), который необходимо отформатировать в XML с помощью FOR XML EXPLICIT. К сожалению, пользователь этого файла потребовал использования тегов CDATA, иначе я бы использовал FOR XML PATH.
Вот что я ищу:
<elem elem_att1="..." elem_att2="1" elem_att3="...">
<a>...</a>
<b>...</b>
<c>...</c>
<d>...</d>
<e>
<e1 e1_att1="..." e1_att2="1">
<e11>...</e11>
<e12><![CDATA[...]]></e12>
<e13><![CDATA[...]]></e13>
</e1>
<e1 e1_att1="..." e1_att2="2">
<e11>...</e11>
<e12><![CDATA[...]]></e12>
<e13><![CDATA[...]]></e13>
</e1>
<e1 e1_att1="..." e1_att2="3">
<e11>...</e11>
<e12><![CDATA[...]]></e12>
<e13><![CDATA[...]]></e13>
</e1>
</e>
<f>
<f1 f1_att1="..." f1_att2="..." />
<f2 f2_att1="..." f2_att2="..." />
<f3 f3_att1="..." f3_att2="..." />
</f>
</elem>
Предположим, что следующие теги и родительские отображения были правильно определены в запросе:
Tag | Parent
elem 2 | 1
a 3 | 2
b 4 | 2
c 5 | 2
d 6 | 2
e 7 | 2
e1 8 | 7
e11 9 | 8
e12 10 | 8
e13 11 | 8
f 12 | 2
f1 13 | 12
f2 14 | 12
f3 15 | 12
Я получил около 90% пути с запросом, но столкнулся с проблемой, связанной с порядком тегов в универсальной таблице. Я ожидаю увидеть следующий вывод для первых двух столбцов таблицы, возвращаемых из запроса:
Tag | Parent
2 | 1
3 | 2
4 | 2
5 | 2
6 | 2
7 | 2 <-- beginning of the "e" element
8 | 7 <-- first instance of the "e1" element
9 | 8
10 | 8
11 | 8
8 | 7 <-- second instance of the "e1" element
9 | 8
10 | 8
11 | 8
8 | 7 <-- third and final instance of the "e1" element
9 | 8
10 | 8
11 | 8
12 | 2 <-- beginning of the "f" element
13 | 12
14 | 12
15 | 12
Вместо этого я получаю это как первые два столбца результата запроса:
Tag | Parent
2 | 1
3 | 2
4 | 2
5 | 2
6 | 2
7 | 2 <-- beginning of the "e" element
12 | 2 <-- beginning of the "f" element
13 | 12
14 | 12
15 | 12
8 | 7 <--first instance of the "e1" element
9 | 8
10 | 8
11 | 8
8 | 7 <-- second instance of the "e1" element
9 | 8
10 | 8
11 | 8
8 | 7 <-- third and final instance of the "e1" element
9 | 8
10 | 8
11 | 8
Который, очевидно, будет генерировать неправильно сформированный XML в соответствии с этим:
<elem elem_att1="..." elem_att2="1" elem_att3="...">
<a>...</a>
<b>...</b>
<c>...</c>
<d>...</d>
<e />
<f>
<f1 f1_att1="..." f1_att2="..." />
<f2 f2_att1="..." f2_att2="..." />
<f3 f3_att1="..." f3_att2="..." />
</f>
<e1 e1_att1="..." e1_att2="1">
<e11>...</e11>
<e12><![CDATA[...]]></e12>
<e13><![CDATA[...]]></e13>
</e1>
<e1 e1_att1="..." e1_att2="2">
<e11>...</e11>
<e12><![CDATA[...]]></e12>
<e13><![CDATA[...]]></e13>
</e1>
<e1 e1_att1="..." e1_att2="3">
<e11>...</e11>
<e12><![CDATA[...]]></e12>
<e13><![CDATA[...]]></e13>
</e1>
</e>
</elem>
Запрос задыхается и выдает следующую ошибку:
Msg 6833, Level 16, State 1, Line 2
Parent tag ID 7 is not among the open tags. FOR XML EXPLICIT requires parent tags to be opened first. Check the ordering of the result set.
Вот мой order by
пункт:
order by [elem!2!att2], [e1!8!att2]
Если я изменю order by
пункт к
order by [elem!2!att2], tag, [e1!8!att2]
запрос выполняется успешно, но все дочерние записи e1
элементы вложены в последний e1
элемент:
<elem elem_att1="..." elem_att2="1" elem_att3="...">
<a>...</a>
<b>...</b>
<c>...</c>
<d>...</d>
<e>
<e1 e1_att1="..." e1_att2="1" />
<e1 e1_att1="..." e1_att2="2" />
<e1 e1_att1="..." e1_att2="3">
<e11>...</e11>
<e11>...</e11>
<e11>...</e11>
<e12><![CDATA[...]]></e12>
<e12><![CDATA[...]]></e12>
<e12><![CDATA[...]]></e12>
<e13><![CDATA[...]]></e13>
<e13><![CDATA[...]]></e13>
<e13><![CDATA[...]]></e13>
</e1>
</e>
<f>
<f1 f1_att1="..." f1_att2="..." />
<f2 f2_att1="..." f2_att2="..." />
<f3 f3_att1="..." f3_att2="..." />
</f>
</elem>
Актуальный вопрос:
Что вызывает f
и его дети для заселения в результате, установленном до населения e
дети?
Я надеюсь, что это относительно распространенная ошибка, решение которой достаточно абстрактно, чтобы передавать ее без необходимости копировать более 1500 строк кода.
1 ответ
Давно я пользовался этим, но пробовал ли ты
order by [elem!2!att2], [e], [e1!8!att2]
или же
order by [elem!2!att2], 7, [e1!8!att2]