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/