Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Création d'un sous-répertoire via SQL INSERT à l'aide de FileTable

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/