sql >> Databasteknik >  >> RDS >> Sqlserver

Skapa underkatalog via SQL INSERT med FileTable

Det här är vad jag slutade använda för att skapa en underkatalog eftersom GetPathLocator() kommer inte att generera en ny path_locator värde för mig - det kommer bara att tolka befintliga 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);

Ovanstående kodblock använder default path_locator-värde upptäckt här som bygger en ny hierarchyid representation från en GUID (med newid() metod och enkel analys ). Funktionen GetNewPathLocator() finns inte någonstans i SQL Server som jag kunde hitta (hierarchyid.GetDescendant() är det närmaste jag kunde hitta, men det använde inte den ursprungliga strukturen som FileTable förlitar sig på ). Kanske i 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

Funktionen GetNewPathLocator() kräver också en SQL-vy getNewID för att begära en newid() med tricket från detta SO-inlägg .

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

För att anropa GetNewPathLocator() , kan du använda standardparametern som genererar en ny hierarchyid eller skicka in en befintlig hiearchyid strängrepresentation (.ToString() ) för att skapa en underordnad hierarchyid som ses nedan...

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


  1. Hur man slår samman två django-modeller (tabeller) till en modell (tabell)

  2. Korskoppling mellan flera scheman i MySQL. Privilegier och prestanda

  3. SQL-ordning efter element från IN-sats

  4. Hur man använder regex i django-frågan