Saya bermain-main dengan HierarchyId, dan saya belum menemukan cara yang ditetapkan untuk melakukan hal berikut:
- masukkan semua subtree sekaligus
- ambil semua subtree sekaligus
Pertanyaan ini terkait dengan yang saya sebelumnya , dan saya curiga satu-satunya cara untuk menyelesaikan dua tugas ini dengan HierarchyId adalah satu node atau satu level pada satu waktu. Jika saya menggunakan jalur terwujud, kedua tindakan mudah dilakukan dengan perintah berbasis set tunggal (dan sepele).
Apa yang saya lewatkan?
Sunting: Saya juga melewatkan cara untuk memindahkan subtree, tetapi saya mempelajarinya dari komentar Mikael Eriksson
Jawaban:
Fungsi yang digunakan adalah GetReparentedValue tetapi ketika hanya menggunakan
GetReparentedValue
pohon mungkin berakhir dalam keadaan "tidak konsisten".Berikut adalah beberapa kode yang disediakan oleh Microsoft yang menangani itu. Subpindahan bergerak .
Saya kira yang terkait dengan ini adalah Menegakkan pohon . Ini menggunakan kolom terhitung untuk id induk yang melakukan self join ke PK.
sumber
Mengambil seluruh subtree sederhana - gunakan
IsDescendentOf
metode ini, sesuai MSDNMemasukkan lebih kompleks tetapi masalah utama Anda adalah kendala Anda - Anda jelas tidak dapat memasukkan objek anak sampai orang tua mereka berkomitmen. Dalam hal ini, lakukan iterate dan masukkan dalam urutan hierarkis, atau matikan kendala dan masukkan.
Ketika memasukkan sejumlah besar data - migrasi, batch atau sisipan massal dll - Saya akan mematikan batasannya. Ketika memasukkan secara operasional saya akan mengulanginya, karena saya belum menemukan contoh selama menjalankan sistem di mana sejumlah besar besar perlu dimasukkan ke hierarki.
sumber