回答

收藏

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

技术问答 技术问答 267 人阅读 | 0 人回复 | 2023-09-14

以前,我要求如何在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/
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则