Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Създаване на поддиректория чрез SQL INSERT с помощта на FileTable

Това е, което в крайна сметка използвах, за да създам поддиректория, тъй като GetPathLocator() няма да генерира нов path_locator стойност за мен - ще интерпретира само съществуващите 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);

Горният кодов блок използва стойността на path_locator по подразбиране е открита тук който изгражда нов hierarchyid представяне от GUID (използване на newid() метод и просто анализиране ). Функцията GetNewPathLocator() не съществува никъде в SQL Server, което мога да намеря (hierarchyid.GetDescendant() е най-близкият, който можах да намеря, но не използва естествената структура, на която разчита FileTable ). Може би в 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

Функцията GetNewPathLocator() също изисква SQL изглед getNewID за заявка на newid() използвайки трика от тази публикация на SO .

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

За да извикате GetNewPathLocator() , можете да използвате параметъра по подразбиране, който ще генерира нов hierarchyid или подайте съществуващ hiearchyid представяне на низ (.ToString() ), за да създадете дъщерен hierarchyid както се вижда по-долу...

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. Как да създадете таблица в SQL Server с помощта на заявка

  2. Закръгляване на милисекунди в T-SQL

  3. Какъв е обхватът на CONTEXT_INFO в SQL Server?

  4. Компресиране на редове с нули и дубликати в единични редове

  5. Как да се покаже дата във формат на дата в САЩ в SQL Server (T-SQL)