Đây là những gì tôi đã kết thúc bằng cách tạo thư mục con kể từ GetPathLocator()
sẽ không tạo giá trị path_locator
mới cho tôi - nó sẽ chỉ giải thích hiện tại hierarchyids
.
DECLARE @parentdir table(path hierarchyid not null);
DECLARE @subdir_locator hierarchyid
-- Create Parent Directory, OUTPUT inserted parent path
INSERT INTO FileTable0 (name,is_directory,is_archive)
OUTPUT INSERTED.path_locator into @parentdir
SELECT 'Directory', 1, 0
-- Create new path_locator based upon parent
SELECT @subdir_locator = dbo.GetNewPathLocator(path) from @parentdir
-- Create Subdirectory
INSERT INTO FileTable0 (name,path_locator,is_directory,is_archive)
VALUES ('subdirectory', @subdir_locator, 1, 0);
Khối mã trên sử dụng các default path_locator value discovered here rằng xây dựng một hierarchyid
đại diện mới từ một GUID (sử dụng newid()
phương pháp, và đơn giản phân tích). Hàm GetNewPathLocator()
không tồn tại ở bất kỳ đâu trong SQL Server mà tôi có thể tìm thấy (hierarchyid.GetDescendant()
là gần nhất tôi có thể tìm thấy, nhưng nó không sử dụng cấu trúc gốc mà FileTable dựa trên). Có lẽ trong SQL.NEXT ...
CREATE FUNCTION dbo.GetNewPathLocator (@parent hierarchyid = null) RETURNS varchar(max) AS
BEGIN
DECLARE @result varchar(max), @newid uniqueidentifier -- declare new path locator, newid placeholder
SELECT @newid = new_id FROM dbo.getNewID; -- retrieve new GUID
SELECT @result = ISNULL(@parent.ToString(), '/') + -- append parent if present, otherwise assume root
convert(varchar(20), convert(bigint, substring(convert(binary(16), @newid), 1, 6))) + '.' +
convert(varchar(20), convert(bigint, substring(convert(binary(16), @newid), 7, 6))) + '.' +
convert(varchar(20), convert(bigint, substring(convert(binary(16), @newid), 13, 4))) + '/'
RETURN @result -- return new path locator
END
GO
Chức năng GetNewPathLocator()
cũng đòi hỏi một cái nhìn SQL getNewID
yêu cầu một newid()
sử dụng trick from this SO post.
create view dbo.getNewID as select newid() as new_id
Để gọi GetNewPathLocator()
, bạn có thể sử dụng tham số mặc định mà sẽ tạo ra một mới hierarchyid
hoặc vượt qua trong một đại diện hiearchyid
chuỗi hiện có (.ToString()
) để tạo ra một đứa trẻ hierarchyid
như bên dưới ...
SELECT dbo.GetNewPathLocator(DEFAULT); -- returns /260114589149012.132219338860058.565765146/
SELECT dbo.GetNewPathLocator('/260114589149012.132219338860058.565765146/'); -- returns /260114589149012.132219338860058.565765146/141008901849245.92649220230059.752793580/
Sau một số thử nghiệm nghiêm ngặt, có vẻ như các báo cáo cập nhật là dễ bị bế tắc khi điều này được gọi là song song. – Tod