2009-02-12 45 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