SQL Server递归存储过程

Rob*_*Rob 3 sql-server recursion stored-procedures

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

场景:

  • 目录表: DirId, ParentId
  • 文件表: FileId, DirId

ParentId是父目录,而根目录具有parentId = NULL...认为这是自我解释。

现在的问题...我想要一个目录及其子目录中存在的列表文件。

对于一个目录,我将创建一个存储过程:

SELECT * FROM Files Where DirId = ????
Run Code Online (Sandbox Code Playgroud)

那么我将如何创建一个存储过程以包含子目录?目前,我正在使用C#代码并遍历每个目录。我更喜欢使用存储过程...除非您证明我错了。

Adr*_*der 5

看看使用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
Run Code Online (Sandbox Code Playgroud)

  • @Rob:递归CTE是必经之路,也是对性能最友好的方式。手工编码的任何其他内容最有可能在性能上更加困难。 (2认同)