Você pode emular a
position()
função contando o número de nós irmãos que precedem cada nó:SELECT
code = value.value('@code', 'int'),
parent_code = value.value('../@code', 'int'),
ord = value.value('for $i in . return count(../*[. << $i]) + 1', 'int')
FROM @Xml.nodes('//value') AS T(value)
Aqui está o conjunto de resultados:
code parent_code ord
---- ----------- ---
1 NULL 1
11 1 1
111 11 1
12 1 2
121 12 1
1211 121 1
1212 121 2
Como funciona:
- O
for $i in .
cláusula define uma variável chamada$i
que contém o nó atual (.
). Este é basicamente um hack para contornar a falta do XQuery de umcurrent()
semelhante ao XSLT função. - O
../*
expressão seleciona todos os irmãos (filhos do pai) do nó atual. - O
[. << $i]
predicado filtra a lista de irmãos para aqueles que precedem (<<
) o nó atual ($i
). - Nós
count()
o número de irmãos anteriores e, em seguida, adicione 1 para obter a posição. Dessa forma, o primeiro nó (que não tem irmãos anteriores) recebe a posição 1.