Estou tentando usar FOR XML
para simular um feed OData. Um dos requisitos que tenho é que em algum lugar eu precise de um elemento XML que seja constante para todos os registros; Eu estava planejando usar a diretiva XMLTEXT para isso.
Meu XML precisa ficar assim; para cada registro no banco de dados,
<entry>
<id>1</id>
<test type="dummy" />
<!-- some more nested elements -->
</entry>
Quando uso a seguinte consulta, o <test>
elemento aparece antes do <id>
elemento, mesmo que a declaração apareça depois dele:
CREATE TABLE #temp (id int);
INSERT INTO #temp VALUES (1), (2);
SELECT
1 AS Tag,
NULL AS Parent,
id AS [entry!1!id!ELEMENT],
'<test type="dummy" />'
AS [entry!1!test!XMLTEXT]
-- other columns
FROM #temp
FOR XML EXPLICIT;
DROP TABLE #temp;
Isso dá os seguintes resultados ( fiddle ):
<entry>
<test type="dummy"/>
<id>1</id>
</entry>
Estou fazendo algo errado aqui ou isso é uma limitação do XMLTEXT? Uma solução alternativa pode ser tratá-lo como um elemento aninhado regular, mas isso funcionaria mesmo que eu tivesse mais elementos aninhados mais abaixo no <entry>
elemento?
Depois de mais alguns mexericos, descobri que existe uma diretiva XML que faz o trabalho (se eu omitir o nome do atributo,
test
):Isso produz os resultados que eu quero:
( demonstração )
Esta diretiva é mencionada brevemente aqui , mas não consegui encontrar mais documentação ou exemplos.
Se você por algum motivo não precisar
for xml explicit
, pode usar ofor xml path
que eu acho um pouco mais fácil de manusear.Você pode converter o literal de string para XML
Ou você pode configurá-lo como um valor