sql >> Base de Datos >  >> RDS >> Sqlserver

Creación de subdirectorio a través de SQL INSERT usando FileTable

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/