2011-08-22 12 views
9

具体的な例は見つかりませんでしたが、hierarchyidデータ型を使用して更新などでディレクトリ構造全体を表現することに興味があります。これはhierarchyidに引用されている一般的な使用例ですが、そのような例を構築する記事は見つかりません。私は、ディスク上のファイルシステムでこれを同期さしようとしていないのです**DB内のファイルシステムを表す(SQL Server 2008のhierarchyidを使用)

/dir1 
/file1 
/dir2 
/dir2/dir3 
/dir2/dir3/file2 

は私だけのようなディレクトリ構造全体を表現したいです。それは純粋にデータベースを通して表されます。ここで**

+2

ファイルと同期してテーブル構造を維持することを期待するにはどうすればよいですシステム?/dir2にファイルを追加すると、テーブルがどれくらい早くそれを知っているべきですか?すぐに、遅れて、決して?実行時にディレクトリ構造を読み込むだけでは意味がありませんか?それには本当にhierarchyidは必要ありません。 –

+0

ありがとう、私はDBをファイルシステムと同期させようとはしていません。基本的には独自のファイルシステムとして動作します(ファイルノードはディスク上のファイルを指しますが、ディレクトリ構造はありません)。私が本当に助けてくれるのは、この部分だけです。ありがとう。 – user8790899800

+0

なぜ@Aaron Bertrandのコメントは、それが本当に関連していないときにupvotedですか?奇妙に思える。 – user8790899800

答えて

7

hierarchyid型介してファイル・システムを示す一例である:

/* 
Setup: 
- Create the table to hold the files 
- nodeDepth is identifier of the depth for readability 
- fullpath is the full path of the file or directory 
- nodePath is the HierarchyID 
- nodePath identifies the row within the tree 
*/ 

DECLARE @t TABLE (
    nodeID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, 
    nodeDepth VARCHAR(10) NOT NULL, 
    fullPath VARCHAR(20) NOT NULL, 
    nodePath HIERARCHYID NOT NULL 
) 

ロードデータ:

/* 
Load the nodePath value with the Parse command: 
- The root node has a single/
- Every nodePath must begin and end with/
- /1/2/ the second item on level 2 
*/ 

INSERT @t (fullPath, nodeDepth, nodePath) VALUES 
('/','1',HIERARCHYID::Parse('/')), 
('/dir1','1.1',HIERARCHYID::Parse('/1/1/')), 
('/file1','1.2',HIERARCHYID::Parse('/1/2/')), 
('/dir2','1.3',HIERARCHYID::Parse('/1/3/')), 
('/dir2/dir3','1.3.1',HIERARCHYID::Parse('/1/3/1/')), 
('/dir2/dir3/file2','1.3.1.1',HIERARCHYID::Parse('/1/3/1/1/')) 

は、パスを表示する:

SELECT * 
FROM @t 

nodeID  nodeDepth fullPath    nodePath 
----------- ---------- -------------------- -------- 
1   1  /     0x 
2   1.1  /dir1    0x5AC0 
3   1.2  /file1    0x5B40 
4   1.3  /dir2    0x5BC0 
5   1.3.1  /dir2/dir3   0x5BD6 
6   1.3.1.1 /dir2/dir3/file2  0x5BD6B0 

(1つのレベル上)FILE2の祖先を取得します。

SELECT * 
FROM @t 
WHERE nodePath = 
    (SELECT nodePath.GetAncestor(1) 
    FROM @t 
    WHERE fullPath = '/dir2/dir3/file2') 

nodeID  nodeDepth fullPath    nodePath 
----------- ---------- -------------------- --------- 
5   1.3.1  /dir2/dir3   0x5BD6 

はDIR2のすべてdescentantsを取得します。

SELECT * 
FROM @t 
WHERE nodePath = HIERARCHYID::GetRoot() 

nodeID  nodeDepth fullPath    nodePath 
----------- ---------- -------------------- -------- 
1   1  /     0x 

SELECT * 
FROM @t 
WHERE nodePath.IsDescendantOf(
    (SELECT nodePath 
    FROM @t 
    WHERE fullPath = '/dir2')) = 1 
AND fullPath <> '/dir2' /* Parent is considered its own descendant */ 

nodeID  nodeDepth fullPath    nodePath 
----------- ---------- -------------------- -------- 
5   1.3.1  /dir2/dir3   0x5BD6 
6   1.3.1.1 /dir2/dir3/file2  0x5BD6B0 

は、ルートパスを取得します。 レベを取得FILE2のL:

SELECT nodePath.GetLevel() AS level 
FROM @t 
WHERE fullPath = '/dir2/dir3/file2' 

level 
------ 
4 

参考文献:

関連する問題