9

以前、ファイルI /OAPIを使用せずに内にディレクトリを作成する方法をリクエストしましたFileTable。作成した親ディレクトリのサブディレクトリを作成します。挿入時に親を割り当てるにはどうすればよいですか?parent_path_locator計算列のようです。

これは私の親を作成します...

INSERT INTO FileTable0 (name,is_directory,is_archive) VALUES ('Directory', 1, 0);

FileTableでこの親の子ディレクトリを作成するにはどうすればよいですか?

4

4 に答える 4

12

これは、私にとって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 ビューも必要です。getNewIDnewid()

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/
于 2012-05-08T14:30:54.403 に答える
0

コードで hierarchyid を再作成しようとするのではなく、SQL が独自の ID を作成した後に path_locator を更新することにしました。

DECLARE @pathID hierarchyid;
DECLARE @parentdir table(path hierarchyid not null);

IF NOT EXISTS(SELECT 1 FROM FileAsset WHERE is_directory = 1 AND file_stream.GetFileNamespacePath() = '\Assets\Test')
INSERT INTO FileAsset (name, is_directory) VALUES( 'Test', 1)

SELECT @pathID = FileAsset.path_locator FROM FileAsset WHERE file_stream.GetFileNamespacePath() = '\Assets\Test'

INSERT INTO FileAsset (name, file_stream) OUTPUT INSERTED.path_locator into @parentdir VALUES('MyDoc.txt', 0x)

UPDATE FileAsset SET path_locator = '/' + REPLACE(@pathID.ToString(), '/','') + path_locator.ToString() WHERE path_locator = (SELECT [path] FROM @parentdir)

「Assets」は FileTable ディレクトリの名前、「Test」はファイルを配置するディレクトリの名前、「MyDoc.txt」はファイル名、0x はファイル ストリームのゼロ エントリです。

私はこれを関数に変えようとしていると確信しています。

見る...

CREATE PROCEDURE InsertFileAsset

    @fileName varchar(255),
    @dirName varchar(255),
    @data varbinary(MAX),
    @stream_id uniqueidentifier OUTPUT
AS
BEGIN
    DECLARE @pathID hierarchyid;
    DECLARE @parentdir table(path hierarchyid not null);
    DECLARE @streamID table(streamID uniqueidentifier not null);

    IF NOT EXISTS(SELECT 1 FROM FileAsset WHERE is_directory = 1 AND file_stream.GetFileNamespacePath() = '\Assets\' + @dirName)
    INSERT INTO FileAsset (name, is_directory) VALUES( @dirName, 1)

    SELECT @pathID = FileAsset.path_locator FROM FileAsset WHERE file_stream.GetFileNamespacePath() = '\Assets\' + @dirName

    INSERT INTO FileAsset (name, file_stream) OUTPUT INSERTED.path_locator into @parentdir VALUES(@fileName, @data)

    UPDATE FileAsset SET path_locator = '/' + REPLACE(@pathID.ToString(), '/','') + path_locator.ToString() OUTPUT inserted.stream_id INTO @streamID WHERE path_locator = (SELECT [path] FROM @parentdir)

    SELECT @stream_id = streamID FROM @streamID

    RETURN
END
GO
于 2015-06-08T14:36:15.770 に答える
0

もう 1 つのオプションは、CLR 統合を使用して、関数とストアド プロシージャを C# コードとして作成することです。

このための GitHub CLR 統合プロジェクトを作成しました。 https://github.com/rhyous/Db.FileTableFramework

CreateFile、CreateDirectory、DirectoryExists など、必要なさまざまな機能や手順があります。もちろん、GitHub では、誰でも変更および改善できます。

于 2016-06-30T23:30:40.413 に答える