В моем приложении я запускаю довольно сложный запрос, используя FOR XML PATH()
для создания результата xml. Я использую этот запрос в нескольких хранимых процедурах, но имена корневого узла и узла первого уровня разные. Что я хотел бы сделать, так это создать скалярную определяемую пользователем функцию, которая принимает два имени узла в качестве параметров и возвращает правильный xml. Ожидаемый результат будет выглядеть следующим образом:
<{root node name}>
<{first level node name} attr1="value1" attr2="value2">
<detail attr1="value3">
<error code="1" descr="some error"/>
<error code="3" descr="some other error"/>
</detail>
</{first level node name}>
<error code="4" descr="yet another error"/>
</{root node name}>
С {имя корневого узла} и {имя узла первого уровня} в качестве параметров
Я знаю, что могу использовать динамический SQL для этого, но это может быть очень громоздко, и я хотел бы избежать этого. Я также мог бы легко сделать это на C# или с помощью XSLT, но мне нужно сделать это полностью на SQL, поскольку он будет вызываться из обработчиков брокера службы SQL.
К сожалению, FOR XML PATH
требует литерала для имени узла. Я также попытался создать xml с известными общими именами узлов, а затем попытался заменить их с помощью XQuery, но для этого также требуются литералы. И XQuery должен быть литералом, и имена узлов, используемые в конструкторах узлов, также должны быть литералами (нельзя использовать sql:variable()
)
Есть ли способ создать XML с динамическими именами узлов?