以前,我要求如何在FileTable不使用File I / O API的情况下在其中创建目录。现在,我想为我刚刚创建的父目录创建一个子目录。在插入期间如何分配我的父母?似乎parent_path_locator是一个计算列。
FileTable
parent_path_locator
这创建了我的父母…
INSERT INTO FileTable0 (name,is_directory,is_archive) VALUES ('Directory', 1, 0);
如何在FileTable中为此父级创建子目录?
这是我最终用来创建子目录的原因,因为它不会为我GetPathLocator()生成新path_locator值-它只会解释现有值hierarchyids。
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 …
hierarchyid
newid()
GetNewPathLocator()
hierarchyid.GetDescendant()
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帖子中的技巧。
getNewID
create view dbo.getNewID as select newid() as new_id
要调用GetNewPathLocator(),您可以使用默认参数,该参数将生成一个新的hierarchyid或传入现有的hiearchyid字符串表示形式( .ToString() )来创建一个子项hierarchyid,如下所示…
hiearchyid
.ToString()
SELECT dbo.GetNewPathLocator(DEFAULT); -- returns /260114589149012.132219338860058.565765146/ SELECT dbo.GetNewPathLocator('/260114589149012.132219338860058.565765146/'); -- returns /260114589149012.132219338860058.565765146/141008901849245.92649220230059.752793580/