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
参考文献:
ファイルと同期してテーブル構造を維持することを期待するにはどうすればよいですシステム?/dir2にファイルを追加すると、テーブルがどれくらい早くそれを知っているべきですか?すぐに、遅れて、決して?実行時にディレクトリ構造を読み込むだけでは意味がありませんか?それには本当にhierarchyidは必要ありません。 –
ありがとう、私はDBをファイルシステムと同期させようとはしていません。基本的には独自のファイルシステムとして動作します(ファイルノードはディスク上のファイルを指しますが、ディレクトリ構造はありません)。私が本当に助けてくれるのは、この部分だけです。ありがとう。 – user8790899800
なぜ@Aaron Bertrandのコメントは、それが本当に関連していないときにupvotedですか?奇妙に思える。 – user8790899800