Запутался, как работает этот запрос - PullRequest
0 голосов
/ 13 февраля 2009

Я пытаюсь изучить продвинутый 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, перейдите к непосредственному подчиненному, этот непосредственный подчиненный теперь @root и т. Д.

Спасибо

Ответы [ 3 ]

5 голосов
/ 13 февраля 2009

Каждый раз, когда выполняется запрос, как увеличивается параметр @EmpId? Это делает сам?

Вот этот:

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

выбирает минимальное EmpID, которое больше уже выбранного, и присваивает его @EmpID.

Конечно, если они есть, новый @EmpID будет больше старого, что означает, что @EmpID увеличивается.

3 голосов
/ 13 февраля 2009

В последнем выборе @EmpID установлен на самый низкий EmpID, который больше, чем @EmpID. Таким образом, @EmpID «увеличивается» до тех пор, пока не будет больше EmpID. В этом случае select min (EmpID) возвращает ноль, и цикл while заканчивается.

@ Root изменяется посредством рекурсивного вызова ShowHierarchy в инструкции EXEC. По сути, текущий @EmpID становится новым @Root в запущенном выполнении.

1 голос
/ 13 февраля 2009

Как говорит Кассной, вот где @EmpId get увеличивается:

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

И да, когда процедура вызывается рекурсивно, она передает @EmpID для текущей рекурсии как новый @Root:

EXEC dbo.ShowHierarchy @EmpID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...