sql >> Database >  >> RDS >> Sqlserver

Subdirectory maken via SQL INSERT met behulp van FileTable

Dit is wat ik uiteindelijk heb gebruikt om een ​​submap te maken sinds GetPathLocator() genereert geen nieuwe path_locator waarde voor mij - het interpreteert alleen bestaande 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);

Het bovenstaande codeblok gebruikt de standaard path_locator-waarde hier ontdekt die een nieuwe hierarchyid bouwt weergave van een GUID (gebruikmakend van newid() methode en eenvoudige ontleding ). De functie GetNewPathLocator() bestaat nergens in SQL Server die ik kon vinden (hierarchyid.GetDescendant() is het dichtst dat ik kon vinden, maar het maakte geen gebruik van de oorspronkelijke structuur waarop FileTable vertrouwt ). Misschien 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

De functie GetNewPathLocator() vereist ook een SQL-weergave getNewID voor het aanvragen van een newid() met behulp van de truc uit dit SO-bericht .

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

Om GetNewPathLocator() . aan te roepen , kunt u de standaardparameter gebruiken die een nieuwe hierarchyid zal genereren of geef een bestaand hiearchyid door tekenreeksrepresentatie (.ToString() ) om een ​​onderliggende hierarchyid te maken zoals hieronder te zien...

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


  1. Hoe mysql naar laravel-querybuilder te converteren

  2. PostgreSQL incrementele back-up en point-in-time herstel

  3. maatwerk op sql datetime-formaat hoe?

  4. Problemen met MySQL-prestaties identificeren met trage zoekopdrachten