C'est ce que j'ai fini par utiliser pour créer un sous-répertoire depuis GetPathLocator()
ne générera pas de nouveau path_locator
valeur pour moi - il n'interprétera que les hierarchyids
existants .
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);
Le bloc de code ci-dessus utilise le valeur path_locator par défaut découverte ici
qui construit un nouveau hierarchyid
représentation à partir d'un GUID (utilisant newid()
méthode et analyse simple ). La fonction GetNewPathLocator()
n'existe nulle part dans SQL Server que j'ai pu trouver (hierarchyid.GetDescendant()
est le plus proche que j'ai pu trouver, mais il n'a pas utilisé la structure native sur laquelle repose FileTable ). Peut-être dans 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
La fonction GetNewPathLocator()
nécessite également une vue SQL getNewID
pour demander un newid()
en utilisant le astuce de ce message SO
.
create view dbo.getNewID as select newid() as new_id
Pour appeler GetNewPathLocator()
, vous pouvez utiliser le paramètre par défaut qui générera un nouveau hierarchyid
ou passez un hiearchyid
existant représentation sous forme de chaîne (.ToString()
) pour créer un enfant hierarchyid
comme on le voit ci-dessous...
SELECT dbo.GetNewPathLocator(DEFAULT); -- returns /260114589149012.132219338860058.565765146/
SELECT dbo.GetNewPathLocator('/260114589149012.132219338860058.565765146/'); -- returns /260114589149012.132219338860058.565765146/141008901849245.92649220230059.752793580/