database - 在 DB 中表示文件系统(在 SQL Server 2008 中使用 hierarchyid)

标签 database sql-server-2008 hierarchyid

我还没有找到这方面的任何具体示例,但我有兴趣使用 hierarchyid 数据类型来表示具有更新等的整个目录结构。这是为 hierarchyid 引用的一个常见用例,但我找不到任何构建此类示例的文章。

我只想表示整个目录结构,例如:

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

** 我不是要将其与磁盘上的文件系统同步。它纯粹通过数据库表示。 **

最佳答案

下面是一个通过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

获取 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 的所有后代:

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

获取根路径:

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

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

获取file2的级别:

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

level
------
4

引用资料:

关于database - 在 DB 中表示文件系统(在 SQL Server 2008 中使用 hierarchyid),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7150794/

相关文章:

.net - 生成人类可读/可用、简短但唯一的 ID

database - 如何在 Oracle SQL Developer 中创建数据库

c# - 在 asp.net 中使用 ID 仅更新一列

java - 在sql server 2008中调用带有表类型输入参数的存储过程

sql - 使用不同邮政编码从同一销售区域获取销售人员

Sql HierarchyId 如何获取最后的后代?

MySQL 和 NetBeans 集成问题

sql-server - 如何使用 'hierarchyid' 参数从 EntityFramework 6 调用存储过程

sql - 使用 HierarchyId 获取直接后代计数

sql - 是否可以找出 SQL Server 中有多少数据库数据早于 N 年?