sql >> Databáze >  >> RDS >> Sqlserver

Vytvoření podadresáře pomocí SQL INSERT pomocí FileTable

To je to, co jsem nakonec použil k vytvoření podadresáře od GetPathLocator() nevygeneruje nový path_locator hodnotu pro mě – bude to interpretovat pouze existující hierarchyid .

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

Výše uvedený blok kódu využívá výchozí hodnota path_locator nalezena zde který vytvoří nový hierarchyid reprezentace z GUID (pomocí newid() metoda a jednoduchá analýza ). Funkce GetNewPathLocator() neexistuje nikde na SQL serveru, který bych mohl najít (hierarchyid.GetDescendant() je nejbližší, co jsem našel, ale nepoužil nativní strukturu, na kterou se FileTable spoléhá ). Možná v 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

Funkce GetNewPathLocator() také vyžaduje zobrazení SQL getNewID pro vyžádání newid() pomocí triku z tohoto příspěvku SO .

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

Chcete-li zavolat GetNewPathLocator() , můžete použít výchozí parametr, který vygeneruje nový hierarchyid nebo předat existující hiarchyid reprezentace řetězce (.ToString() ), chcete-li vytvořit podřízený hierarchyid jak je vidět níže...

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


  1. Oracle objednávejte za různých podmínek

  2. Byla zadána neplatná adresa URL Oracle:OracleDataSource.makeURL

  3. Hromadná aktualizace záznamů pomocí SQL

  4. Oracle Database, příkaz SQL Update nebude fungovat (OLEDB)