Esto es lo que terminé usando para crear un subdirectorio desde GetPathLocator() no generará un nuevo path_locator valor para mí:solo interpretará los hierarchyids existentes .
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);
El bloque de código anterior utiliza valor predeterminado de path_locator descubierto aquí
que construye un nuevo hierarchyid representación de un GUID (utilizando newid()
método y análisis simple ). La función GetNewPathLocator() no existe en ninguna parte de SQL Server que pueda encontrar (hierarchyid.GetDescendant()
es lo más cercano que pude encontrar, pero no usó la estructura nativa en la que se basa FileTable ). Tal vez en 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 función GetNewPathLocator() también requiere una vista SQL getNewID para solicitar un newid() usando el truco de esta publicación SO
.
create view dbo.getNewID as select newid() as new_id
Para llamar a GetNewPathLocator() , puede usar el parámetro predeterminado que generará un nuevo hierarchyid o pasar un hiearchyid existente representación de cadena (.ToString() ) para crear un hijo hierarchyid como se ve a continuación...
SELECT dbo.GetNewPathLocator(DEFAULT); -- returns /260114589149012.132219338860058.565765146/
SELECT dbo.GetNewPathLocator('/260114589149012.132219338860058.565765146/'); -- returns /260114589149012.132219338860058.565765146/141008901849245.92649220230059.752793580/