sql-server - SQL Server 递归存储过程

标签 sql-server stored-procedures recursion

我正在尝试列出虚拟目录及其子目录中的所有文件。这可能是一家公司的员工及其下属,这不是文件系统。也许递归存储过程不是答案。

场景:

  • 目录表: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/

相关文章:

Mysql存储过程只在第一次返回null

algorithm - 如果记忆化是自上而下的深度优先,而 DP 是自下而上的广度优先,那么自上而下的广度优先/自下而上的深度优先等价物是什么?

c++ - 递归比较字符串的函数 - C++

sql - 关于 SQL Server 中 INSERT 语句性能的建议

sql-server - 无法添加 Sql Server 登录名

选择特定于数据库的对象时,SQL Server Management Studio 连接默认为 'master'

java - 如何从java确定mysql中存储过程中没有参数

c# - 如何在VS2010和VS2012中加载数据库项目?

c# - 将两个或多个 MySQL 过程合并到一个 SQL 文件中

java - 将迭代转换为递归