Sli*_*SFT 9 sql filestream sql-server-2012 filetable
以前,我曾要求如何在FileTable
不使用File I/O API 的情况下在a中创建目录.我现在想要创建一个我刚刚创建的父目录的子目录.如何在插入期间指定我的父母?它似乎parent_path_locator
是一个计算列.
这创造了我的父母......
INSERT INTO FileTable0 (name,is_directory,is_archive) VALUES ('Directory', 1, 0);
Run Code Online (Sandbox Code Playgroud)
如何在FileTable中为此父目录创建子目录?
Sli*_*SFT 10
这是我最终用来创建一个子目录,因为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);
Run Code Online (Sandbox Code Playgroud)
上面的代码块利用此处发现的默认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
Run Code Online (Sandbox Code Playgroud)
该函数GetNewPathLocator()
还需要一个SQL视图getNewID
来请求newid()
使用此SO帖子中的技巧.
create view dbo.getNewID as select newid() as new_id
Run Code Online (Sandbox Code Playgroud)
要调用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/
Run Code Online (Sandbox Code Playgroud)