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/