Apakah ada cara yang ditetapkan berdasarkan untuk memuat / membaca cabang pohon dengan HierarchyId

11

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

AK
sumber
2
Pernahkah kamu melihat ini? Moving Subtrees
Mikael Eriksson
@MikaelEriksson dapatkah Anda membuat komentar sebagai jawaban?
AK
2
Tentu. Saya juga menguraikan sedikit tentang bagaimana saya memahami apa yang sedang terjadi. BTW, saya hanya menguji sedikit pada HierarchyId, tidak pernah menggunakannya dalam produksi.
Mikael Eriksson

Jawaban:

5

Fungsi yang digunakan adalah GetReparentedValue tetapi ketika hanya menggunakan GetReparentedValuepohon 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.

Mikael Eriksson
sumber
Ini adalah jawaban terbaik sejauh ini. Sayangnya, saya tidak melihat cara untuk memasukkan / memilih subtree lebih dari satu level dalam satu perintah.
AK
3

Mengambil seluruh subtree sederhana - gunakan IsDescendentOfmetode ini, sesuai MSDN

DECLARE @Manager hierarchyid
SELECT @Manager = OrgNode FROM HumanResources.EmployeeDemo
  WHERE LoginID = 'adventure-works\dylan0'

SELECT * FROM HumanResources.EmployeeDemo
WHERE OrgNode.IsDescendantOf(@Manager) = 1

Memasukkan 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.

Kirk Broadhurst
sumber