小编典典

使用FileTable通过SQL INSERT创建子目录

sql

以前,我要求如何在FileTable不使用File I / O
API的情况下在其中创建目录
。现在,我想为我刚刚创建的父目录创建一个子目录。在插入期间如何分配我的父母?似乎parent_path_locator是一个计算列。

这创建了我的父母…

INSERT INTO FileTable0 (name,is_directory,is_archive) VALUES ('Directory', 1, 0);

如何在FileTable中为此父级创建子目录?


阅读 218

收藏
2021-04-19

共1个答案

小编典典

这是我最终用来创建子目录的原因,因为它不会为我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/
2021-04-19