Đây là những gì tôi đã sử dụng để tạo một thư mục con kể từ GetPathLocator ()
sẽ không tạo path_locator
mới đối với tôi - nó sẽ chỉ diễn giải hierarchyids hiện có
.
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 giá trị path_locator mặc định được phát hiện tại đây
xây dựng một hierarchyid
mới đại diện từ GUID ( sử dụng newid ()
và phân tích cú pháp đơn giản ). 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 mà 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 vào ). Có thể 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
Hàm GetNewPathLocator ()
cũng yêu cầu chế độ xem SQL getNewID
để yêu cầu newid ()
sử dụng thủ thuật từ bài đăng SO này
.
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 sẽ tạo ra một hierarchyid
mới hoặc chuyển hiearchyid
hiện có biểu diễn chuỗi ( .ToString ()
) để tạo hierarchyid
con như được thấy 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/