2009-02-12 44 views
0

我想學習先進的SQL和如何使用系統查詢(SQL服務器)。下面的查詢有點令人困惑。困惑這個查詢如何工作

CREATE PROC dbo.ShowHierarchy 
(
    @Root int 
) 
AS 
BEGIN 
    SET NOCOUNT ON 
    DECLARE @EmpID int, @EmpName varchar(30) 

    SET @EmpName = (SELECT EmpName FROM dbo.Emp WHERE EmpID = @Root) 
    PRINT REPLICATE('-', @@NESTLEVEL * 4) + @EmpName 

    SET @EmpID = (SELECT MIN(EmpID) FROM dbo.Emp WHERE MgrID = @Root) 

    WHILE @EmpID IS NOT NULL 
    BEGIN 
     EXEC dbo.ShowHierarchy @EmpID 
     SET @EmpID = (SELECT MIN(EmpID) FROM dbo.Emp WHERE MgrID = @Root AND EmpID > @EmpID) 
    END 
END 
GO 

從這裏摘自:

http://vyaskn.tripod.com/hierarchies_in_sql_server_databases.htm

查詢運行每次,怎麼會是@EmpId參數會增加嗎?它自己做?另外,每個遞歸都有@root增量嗎?例如。 CEO是根,去直接下屬,即直接下屬,現在@root等

感謝

回答

5

查詢運行每次,怎麼會是@EmpId參數會增加嗎?它自己做?

這一個:

SET @EmpID = (SELECT MIN(EmpID) FROM dbo.Emp WHERE MgrID = @Root AND EmpID > @EmpID) 

選擇最小EmpID比已經選擇的一個較大的,並且將其分配給@EmpID

當然,如果有的話,新的@EmpID會比舊的大,這意味着@EmpID增加了。

+0

你打我幾秒鐘。 ;-) – Thorsten 2009-02-12 22:06:08

3

在最後選擇@EmpID被設置爲大於@EmpID的最低EmpID。這樣,@EmpID被「遞增」,直到沒有更大的EmpID。在這種情況下,select min(EmpID)返回null,while循環結束。

@Root通過對EXEC語句中的ShowHierarchy的遞歸調用進行更改。基本上,當前@EmpID成爲觸發執行中的新@Root。

1

由於Quassnoi說,這就是@EmpId GET遞增真實:

SET @EmpID = (SELECT MIN(EmpID) FROM dbo.Emp WHERE MgrID = @Root AND EmpID > @EmpID) 

是的,當過程被遞歸調用,它通過@EmpID當前遞歸作爲新@root:

EXEC dbo.ShowHierarchy @EmpID