Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Tworzenie podkatalogu przez SQL INSERT przy użyciu FileTable

Właśnie tego użyłem do stworzenia podkatalogu, ponieważ GetPathLocator() nie wygeneruje nowego path_locator wartość dla mnie - zinterpretuje tylko istniejące 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);

Powyższy blok kodu wykorzystuje odkryto tutaj domyślną wartość path_locator który buduje nowy hierarchiid reprezentacja z identyfikatora GUID (wykorzystując newid() metoda i proste parsowanie ). Funkcja GetNewPathLocator() nie istnieje w SQL Serverze, który mógłbym znaleźć (hierarchyid.GetDescendant() jest najbliższy, jaki udało mi się znaleźć, ale nie używa natywnej struktury, na której opiera się FileTable ). Może w 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

Funkcja GetNewPathLocator() wymaga również widoku SQL getNewID za żądanie newid() za pomocą sztuczki z tego posta SO .

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

Aby wywołać GetNewPathLocator() , możesz użyć domyślnego parametru, który wygeneruje nowy hierarchyid lub przekaż istniejący hiearchyid reprezentacja ciągu (.ToString() ), aby utworzyć potomny hierarchiid jak widać poniżej...

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaki jest najlepszy sposób, aby umożliwić użytkownikowi dodawanie kolumn do bazy danych w locie?

  2. SQL wybierz wiele wierszy w jednej kolumnie

  3. SQL Uzyskaj ostatnie wystąpienie pola w każdym wierszu

  4. Zautomatyzuj przywracanie testowe bazy danych w SQL Server

  5. Za mało pamięci systemowej w puli zasobów do wykonywania skryptów SQL w SQL Server 2008