sql >> Database teknologi >  >> RDS >> Sqlserver

Oprettelse af underkatalog via SQL INSERT ved hjælp af FileTable

Dette er hvad jeg endte med at bruge til at oprette en undermappe siden GetPathLocator() genererer ikke en ny path_locator værdi for mig - det vil kun fortolke eksisterende 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);

Ovenstående kodeblok bruger standard path_locator-værdi fundet her der bygger et nyt hierarchyid repræsentation fra en GUID (ved hjælp af newid() metode og simpel parsing ). Funktionen GetNewPathLocator() findes ikke nogen steder i SQL Server, som jeg kunne finde (hierarchyid.GetDescendant() er det nærmeste jeg kunne finde, men det brugte ikke den oprindelige struktur, som FileTable er afhængig af ). Måske 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 også en SQL-visning getNewID for at anmode om en newid() ved at bruge tricket fra dette SO-indlæg .

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

For at kalde GetNewPathLocator() , kan du bruge standardparameteren, som vil generere en ny hierarchyid eller indsend en eksisterende hiearchyid strengrepræsentation (.ToString() ) for at oprette et underordnet hierarchyid som vist nedenfor...

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


  1. Oprettelse af ENUM-variabeltype i MySQL

  2. Anmodningen mislykkedes, eller svarede tjenesten ikke rettidigt?

  3. Hvad er den hurtigste måde at hente sekventielle data fra databasen?

  4. Hvordan sender man SSIS-variabler i ODBC SQLCommand-udtryk?