|
以前,我要求如何在FileTable不使用File I / O& x1 O5 r. ], L
API在其中创建目录。现在,我想为我刚创建的父亲目录创建一个子目录。如何在插入期间分配我的父母?parent_path_locator是计算列。3 I* {4 ~2 C y
这创造了我的父母…
' g- F: ]' M9 G" Q. {) MINSERT INTO FileTable0 (name,is_directory,is_archive) VALUES ('Directory',1,0);如何在FileTable为此父级创建子目录?1 B2 H6 i. M) R6 j; M( N" P% U& l; Z
! F% w( M0 J% k! c+ D' ?
解决方案: 4 V6 O3 x0 z. P4 J# i" D4 e9 J
这就是为什么我最终用它来创建子目录,因为它不会给我GetPathLocator()生成新path_locator值-它只解释现有值hierarchyids。& t) V% t+ @, s7 h+ E& o) z! A( J
DECLARE @parentdir table(path hierarchyid not null);DECLARE @subdir_locator hierarchyid-- Create Parent Directory,OUTPUT inserted parent pathINSERT INTO FileTable0 (name,is_directory,is_archive) OUTPUT INSERTED.path_locator into @parentdirSELECT 'Directory',1,0-- Create new path_locator based upon parentSELECT @subdir_locator = dbo.GetNewPathLocator(path) from @parentdir-- Create SubdirectoryINSERT INTO FileTable0 (name,path_locator,is_directory,is_archive) VALUES ('subdirectory',@subdir_locator,1,0);上面的代码块利用了在此发现的默认path_locator值,该值hierarchyid从GUID构建了一种新的表达形式(
1 ?2 ~$ m# ]9 i! E ~5 u* w使用newid()方法和简单分析)。该函数GetNewPathLocator()在SQL
' I$ D9 M( P+ A8 |& O! PServer我找不到的任何地方都不存在(这个1 D: [5 {0 O8 _6 G8 L3 O
hierarchyid.GetDescendant() 是_我能找到 _的最接近 的函数 ,但它没有使用FileTable本机结构依赖: ~) _' X2 J( B. `# ~$ P
)。也许在SQL.NEXT …
$ ]' G: L% o) E8 q" k. I# L0 fCREATE FUNCTION dbo.GetNewPathLocator (@parent hierarchyid = null) RETURNS varchar(max) ASBEGIN 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). convert(varchar(20),convert(bigint,substring(convert(binary(16),@newid),13、4)) RETURN @result -- return new path locator ENDGO该函数GetNewPathLocator()还需要一个SQL视图,getNewID
# K9 I# q& P) ?, Y以请求newid()使用此SO帖子中的技巧。
' |* s' A) G% `8 z6 t3 Vcreate view dbo.getNewID as select newid() as new_id要调用GetNewPathLocator(),您可以使用默认参数生成新的参数hierarchyid或现有的hiearchyid字符串表示形式(
, {+ Z i" b- q- j9 a8 W! [.ToString() )创建子项hierarchyid,如下所示…+ C% Q4 x5 K& u6 l+ f6 S# S
SELECT dbo.GetNewPathLocator(DEFAULT); -- returns /260114589149012.132219338860058.565765146/SELECT dbo.GetNewPathLocator('/260114589149012.132219338860058.565765146/'); -- returns /260114589149012.132219338860058.565765146/141008901849245.92649220230059.57793580/ |
|