2010-12-09 61 views
2

我想列出虛擬目錄中的所有文件,它是子目錄。這可能是下屬公司的員工,這不是文件系統。也許遞歸存儲過程可能不是答案。SQL Server遞歸存儲過程

場景:

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

ParentId是父目錄的根目錄具有parentId = NULL ...認爲這是自我解釋。

現在的問題......我想要一個目錄及其子目錄中存在的列表文件。

只是一個目錄我將創建一個存儲過程:

SELECT * FROM Files Where DirId = ???? 

那麼我將如何創建一個存儲過程,包括子目錄?目前我正在使用C#代碼並遍歷每個目錄。我更喜歡使用存儲過程,除非你證明我錯了。

+2

考慮使用[遞歸CTE查詢](http://msdn.microsoft.com/en-us/library/ms186243.aspx),也許。 – 2010-12-09 08:38:14

+1

你想通過SQL Server訪問文件系統?這通過應用程序代碼更容易,更容易完成。你能解釋在SQL中如何解決這個問題嗎? – Oded 2010-12-09 08:39:08

+0

爲什麼你要使用存儲過程來完成一項明顯更適合在C#等代碼中執行的任務? – 2010-12-09 08:39:13

回答

4

看看使用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 
-1

實際上,遞歸不是一個好的解決方案。 DBA不希望我們使用遞歸,

你可以使用這個腳本來獲取目錄和子目錄

Select d.FileName, f.* from Files f 
left Join Files fsub on fsub.DirId = f.DirId 
inner Join Directory d on d.DirId = f.DirId 

子目錄和目錄將與此腳本列出

1

我想你「再要求是不實際訪問文件系統,而是你必須在你的數據庫表中所示的目錄結構,在這種情況下,你可以使用遞歸CTE是這樣的:

DECLARE @DirId INTEGER 
SET @DirId = 1 

;WITH CTEFolders AS 
(
SELECT FileId, DirId FROM Files WHERE DirId = @DirId 
UNION ALL 
SELECT fi.FileId, fi.DirId 
FROM CTEFolders c 
    JOIN Folders fo ON c.DirId = fo.ParentId = c.DirId 
    JOIN Files fi ON fo.DirId = fi.DirId 
) 
SELECT * FROM CTEFolders 

這裏有一個很好的MSDN reference on recursive CTEs