Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Encontrando a ordem do nó no documento XML no SQL Server


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 um current() 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.