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/