Anda dapat meniru position()
fungsi dengan menghitung jumlah node saudara sebelum setiap node:
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)
Berikut adalah kumpulan hasil:
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
Cara kerjanya:
for $i in .
klausa mendefinisikan variabel bernama$i
yang berisi simpul saat ini (.
). Ini pada dasarnya adalah peretasan untuk mengatasi kekurangan XQuery daricurrent()
seperti XSLT fungsi.../*
ekspresi memilih semua saudara (anak dari orang tua) dari simpul saat ini.[. << $i]
predikat menyaring daftar saudara dengan yang mendahului (<<
) simpul saat ini ($i
).- Kami
count()
jumlah saudara sebelumnya dan kemudian tambahkan 1 untuk mendapatkan posisi. Dengan cara itu node pertama (yang tidak memiliki saudara kandung sebelumnya) diberi posisi 1.