混淆了这个查询的工作原理

时间:2009-02-12 21:58:24

标签: sql tsql

我正在尝试学习高级sql以及如何使用系统查询(sql server)。以下查询有点令人困惑。

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,直接下属,直接下属现在是@root等。

由于

3 个答案:

答案 0 :(得分:5)

  

每次查询运行时,@ EmpId参数如何递增?它会自己做吗?

这一个:

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

选择大于已选择的EmpID的最小@EmpID,并将其分配给@EmpID

当然,如果有的话,新@EmpID将大于旧{{1}},这意味着{{1}}会增加。

答案 1 :(得分:3)

在最后一个选择中,@ EmpID设置为大于@EmpID的最低EmpID。这样,@ Empid“递增”,直到没有更大的EmpID。在这种情况下,select min(EmpID)返回null,while循环结束。

通过对EXEC语句中的ShowHierarchy的递归调用来更改@Root。基本上,当前的@EmpID成为触发执行中的新@Root。

答案 2 :(得分:1)

正如Quassnoi所说,这是@EmpId得到增加的地方:

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

是的,当递归调用该过程时,它会将当前递归的@EmpID作为新的@Root传递:

EXEC dbo.ShowHierarchy @EmpID