Inilah yang akhirnya saya gunakan untuk membuat subdirektori sejak GetPathLocator() tidak akan menghasilkan path_locator baru nilai untuk saya - itu hanya akan menafsirkan hierarchyids yang ada .
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);
Blok kode di atas menggunakan nilai path_locator default ditemukan di sini
yang membangun hierarchyid baru representasi dari GUID (memanfaatkan newid()
metode, dan penguraian sederhana ). Fungsi GetNewPathLocator() tidak ada di mana pun di SQL Server yang dapat saya temukan (hierarchyid.GetDescendant()
adalah yang paling dekat yang bisa saya temukan, tetapi tidak menggunakan struktur asli yang diandalkan FileTable ). Mungkin di 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
Fungsi GetNewPathLocator() juga memerlukan tampilan SQL getNewID untuk meminta newid() menggunakan trik dari pos SO ini
.
create view dbo.getNewID as select newid() as new_id
Untuk memanggil GetNewPathLocator() , Anda dapat menggunakan parameter default yang akan menghasilkan hierarchyid baru atau berikan hiearchyid yang ada representasi string (.ToString() ) untuk membuat anak hierarchyid seperti yang terlihat di bawah ini...
SELECT dbo.GetNewPathLocator(DEFAULT); -- returns /260114589149012.132219338860058.565765146/
SELECT dbo.GetNewPathLocator('/260114589149012.132219338860058.565765146/'); -- returns /260114589149012.132219338860058.565765146/141008901849245.92649220230059.752793580/