Bạn có thể mô phỏng position()
chức năng bằng cách đếm số lượng nút anh em trước mỗi nút:
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)
Đây là tập hợp kết quả:
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
Cách hoạt động:
-
for $i in .
mệnh đề xác định một biến có tên$i
chứa nút hiện tại (.
). Về cơ bản, đây là một bản hack để giải quyết vấn đề XQuery thiếucurrent()
giống XSLT chức năng. -
../*
biểu thức chọn tất cả anh chị em (con của cha mẹ) của nút hiện tại. -
[. << $i]
vị từ lọc danh sách các anh chị em thành những người đứng trước (<<
) nút hiện tại ($i
). - Chúng tôi
count()
số anh chị em đứng trước rồi thêm 1 vào để được vị trí. Bằng cách đó, nút đầu tiên (không có anh chị em nào trước đó) được gán vị trí là 1.