Aquí es un ejemplo de lo que representa un sistema de archivos a través 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
)
carga de datos:
/*
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/'))
muestran los caminos:
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
Obtener los ancestros de fichero2 (hasta un nivel):
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
obtener todos Descentants de directorio2:
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
obtener la ruta raíz:
SELECT *
FROM @t
WHERE nodePath = HIERARCHYID::GetRoot()
nodeID nodeDepth fullPath nodePath
----------- ---------- -------------------- --------
1 1 / 0x
Obtén el nivel l de fichero2:
SELECT nodePath.GetLevel() AS level
FROM @t
WHERE fullPath = '/dir2/dir3/file2'
level
------
4
Referencias:
¿Cómo esperas para mantener la estructura de la tabla en sincronía con el archivo ¿sistema? Si agrego un archivo en/dir2, ¿qué tan rápido debe saber la tabla al respecto? Inmediatamente, un poco de retraso, ¿nunca? ¿No tendría más sentido leer en la estructura del directorio en tiempo de ejecución? Realmente no necesitaría hierarchyid para eso. –
Gracias, no estoy tratando de mantener el DB sincronizado con el sistema de archivos. Básicamente, actuará como su propio sistema de archivos (los nodos del archivo apuntarán a los archivos en el disco, pero no habrá una estructura de directorio). Todo lo que realmente necesito ayuda es solo esta parte de eso. Gracias. – user8790899800
¿Por qué el comentario de @Aaron Bertrand está siendo votado cuando no es realmente relevante? Parece extraño. – user8790899800