Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Erstellen eines Unterverzeichnisses über SQL INSERT mit FileTable

Dies ist, was ich am Ende verwendet habe, um ein Unterverzeichnis seit GetPathLocator() zu erstellen generiert keinen neuen path_locator Wert für mich - es interpretiert nur vorhandene hierarchyids .

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);

Der obige Codeblock verwendet den hier gefundener Standardwert path_locator das baut eine neue hierarchyid auf Darstellung aus einer GUID (unter Verwendung von newid() -Methode und einfaches Parsen ). Die Funktion GetNewPathLocator() existiert nirgendwo in SQL Server, den ich finden konnte (hierarchyid.GetDescendant() ist die nächste, die ich finden konnte, aber es hat nicht die native Struktur verwendet, auf die sich FileTable stützt ). Vielleicht in 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

Die Funktion GetNewPathLocator() erfordert auch eine SQL-Ansicht getNewID zum Anfordern einer newid() mit dem Trick aus diesem SO-Beitrag .

create view dbo.getNewID as select newid() as new_id 

Um GetNewPathLocator() aufzurufen , können Sie den Standardparameter verwenden, der eine neue hierarchyid generiert oder übergeben Sie eine vorhandene hiearchyid Zeichenfolgendarstellung (.ToString() ), um eine untergeordnete hierarchyid zu erstellen wie unten zu sehen...

SELECT dbo.GetNewPathLocator(DEFAULT); -- returns /260114589149012.132219338860058.565765146/
SELECT dbo.GetNewPathLocator('/260114589149012.132219338860058.565765146/'); -- returns /260114589149012.132219338860058.565765146/141008901849245.92649220230059.752793580/