我正在尝试列出虚拟目录及其子目录中的所有文件。这可能是一家公司的员工及其下属,这不是文件系统。也许递归存储过程不是答案。
场景:
- 目录表:
DirId、ParentId
- 文件表:
FileId, DirId
ParentId
是父目录,根目录有 parentId = NULL
...认为这是不言自明的。
现在的问题是...我想要一个存在于目录及其子目录中的文件列表。
我会为一个目录创建一个存储过程:
SELECT * FROM Files Where DirId = ????
那么我该如何创建一个包含子目录的存储过程呢?目前我正在使用 C# 代码并循环遍历每个目录。我更喜欢使用存储过程...除非你证明我错了。
最佳答案
看看使用 CTE .
有点像
DECLARE @Directory Table(
DirId INT,
ParentId INT
)
DECLARE @Files Table(
FileId INT,
DirId INT
)
INSERT INTO @Directory SELECT 1, NULL
INSERT INTO @Directory SELECT 2, 1
INSERT INTO @Directory SELECT 3, 1
INSERT INTO @Directory SELECT 4, 2
INSERT INTO @Files SELECT 1, 1
INSERT INTO @Files SELECT 2, 1
INSERT INTO @Files SELECT 3, 2
INSERT INTO @Files SELECT 4, 2
INSERT INTO @Files SELECT 5, 3
INSERT INTO @Files SELECT 6, 3
INSERT INTO @Files SELECT 7, 4
INSERT INTO @Files SELECT 8, 4
;WITH Directories AS (
SELECT DirId,
ParentID
FROM @Directory
WHERE DirId = 2
UNION ALL
SELECT d.DirId,
d.ParentID
FROM @Directory d INNER JOIN
Directories p ON d.ParentId = p.DirId
)
SELECT *
FROM Directories d INNER JOIN
@Files f ON d.DirId = f.DirId
关于sql-server - SQL Server 递归存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4396276/