これは、私にとって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
関数には、この SO 投稿のトリックを使用して リクエストするためGetNewPathLocator()
の SQL ビューも必要です。getNewID
newid()
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/