มีวิธีการตั้งค่าในการโหลด / อ่านสาขาต้นไม้ด้วย HierarchyId


11

ฉันกำลังเล่นกับ HierarchyId และฉันยังไม่ได้คิดวิธีที่จะทำตามต่อไปนี้:

  • แทรกทรีย่อยทั้งหมดในคราวเดียว
  • ดึงทรีย่อยทั้งหมดในครั้งเดียว

คำถามนี้เกี่ยวข้องกับคำถามก่อนหน้าของฉันและฉันสงสัยว่าวิธีเดียวที่จะทำงานสองอย่างนี้ให้สำเร็จด้วย HierarchyId คือหนึ่งโหนดหรือหนึ่งระดับในแต่ละครั้ง หากฉันใช้เส้นทางที่เป็นรูปธรรมการกระทำทั้งสองอย่างสามารถทำได้อย่างง่ายดายโดยคำสั่งพื้นฐานเดียว (และไม่สำคัญ)

ฉันกำลังคิดถึงอะไร

แก้ไข: ฉันพลาดวิธีย้ายทรีย่อย แต่ฉันเรียนรู้จากความคิดเห็นของ Mikael Eriksson


2
คุณเคยเห็นสิ่งนี้หรือไม่ ย้าย Subtrees
Mikael Eriksson

@MikaelEriksson คุณสามารถแสดงความคิดเห็นคำตอบของคุณ?
AK

2
แน่ใจ ฉันยังอธิบายเพิ่มเติมเล็กน้อยว่าฉันเข้าใจว่าเกิดอะไรขึ้น BTW ฉันได้ทดสอบเพียงเล็กน้อยกับ HierarchyId ไม่เคยใช้ในการผลิต
Mikael Eriksson

คำตอบ:


5

ฟังก์ชั่นที่จะใช้คือGetReparentedValueแต่เมื่อใช้เฉพาะGetReparentedValueทรีอาจสิ้นสุดในสถานะ "ไม่สอดคล้อง"

นี่คือรหัสบางส่วนที่ Microsoft เตรียมไว้ให้ ย้าย subtrees

ฉันเดาว่าเกี่ยวข้องกับการนี้จะบังคับใช้ต้นไม้ มันใช้คอลัมน์จากการคำนวณสำหรับผู้ปกครองรหัสที่เข้าร่วมตัวเองเพื่อ PK


นี่คือคำตอบที่ดีที่สุด น่าเสียดายที่ฉันไม่เห็นวิธีการแทรก / เลือกทรีย่อยของมากกว่าหนึ่งระดับในหนึ่งคำสั่ง
AK

3

การดึงทรีย่อยทั้งหมดนั้นง่าย - ใช้IsDescendentOfเมธอดตามMSDN

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

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

การแทรกมีความซับซ้อนมากขึ้น แต่ปัญหาหลักของคุณจะอยู่ที่ข้อ จำกัด ของคุณ - คุณไม่สามารถแทรกวัตถุลูกได้จนกว่าพ่อแม่จะกระทำ ในกรณีนี้อาจวนซ้ำและแทรกตามลำดับชั้นหรือปิดข้อ จำกัด และส่วนแทรก

เมื่อแทรกข้อมูลจำนวนมาก - การโยกย้ายแบทช์หรือแทรกจำนวนมาก ฯลฯ - ฉันจะปิดข้อ จำกัด เมื่อแทรกการดำเนินการฉันจะทำซ้ำเพราะฉันไม่พบอินสแตนซ์ระหว่างการทำงานของระบบที่ต้องการแทรกจำนวนมากในลำดับชั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.