Có một cách dựa trên tập hợp để tải / đọc một nhánh cây với HVELyId


11

Tôi đang chơi xung quanh với HVELyId và tôi chưa tìm ra một cách dựa trên tập hợp nào để làm như sau:

  • chèn tất cả các cây con cùng một lúc
  • lấy tất cả cây con cùng một lúc

Câu hỏi này có liên quan đến câu hỏi trước của tôi và tôi nghi ngờ cách duy nhất để hoàn thành hai nhiệm vụ này với HVELyId là một nút hoặc một cấp độ tại một thời điểm. Nếu tôi đang sử dụng đường dẫn cụ thể hóa, cả hai hành động đều được thực hiện dễ dàng bằng một lệnh dựa trên tập hợp (và tầm thường).

Tôi đang thiếu gì?

Chỉnh sửa: Tôi cũng đã bỏ lỡ một cách để di chuyển một cây con, nhưng tôi đã học được nó từ nhận xét của Mikael Eriksson


2
Bạn đã thấy cái này chưa? Chuyển động phụ
Mikael Eriksson

@MikaelEriksson bạn có thể đưa ra nhận xét của mình không?
AK

2
Chắc chắn rồi. Tôi cũng đã xây dựng một chút về cách tôi hiểu những gì đang xảy ra. BTW, tôi mới chỉ thử nghiệm một chút về HVELyId, chưa bao giờ sử dụng nó trong sản xuất.
Mikael Eriksson

Câu trả lời:


5

Chức năng sử dụng là GetReparentsValue nhưng khi chỉ sử dụng GetReparentedValuecây có thể sẽ ở trạng thái "không nhất quán".

Đây là một số mã được cung cấp bởi Microsoft đảm nhận việc đó. Di chuyển cây con .

Tôi đoán rằng liên quan đến điều này là Cưỡng chế một cái cây . Nó sử dụng một cột được tính cho id cha tự tham gia PK.


Đây là câu trả lời tốt nhất cho đến nay. Thật không may, tôi không thấy một cách để chèn / chọn một cây con có nhiều cấp độ trong một lệnh.
AK

3

Lấy toàn bộ cây con rất đơn giản - sử dụng IsDescendentOfphương thức, theo MSDN

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

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

Chèn phức tạp hơn nhưng vấn đề chính của bạn sẽ là với các ràng buộc của bạn - rõ ràng bạn không thể chèn các đối tượng con cho đến khi cha mẹ của chúng được cam kết. Trong trường hợp này, lặp đi lặp lại và chèn theo thứ tự phân cấp, hoặc tắt các ràng buộc và chèn.

Khi chèn một lượng lớn dữ liệu - di chuyển, chèn hàng loạt hoặc hàng loạt, v.v. - Tôi sẽ tắt ràng buộc. Khi chèn hoạt động tôi sẽ lặp đi lặp lại, vì tôi không gặp phải trường hợp nào trong quá trình chạy hệ thống, nơi một lượng lớn nhu cầu lớn cần được chèn vào hệ thống phân cấp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.