Каждый вызов EXEC GetMSOrg
продолжает выполняться по запросу
SELECT @ReportsToPersonnelNbr = ReportsToPersonnelNbr
FROM ReportsTo
WHERE PersonnelNumber = @PersonnelNumber
И есть предложение выхода, когда PersonnelNumber больше никому не отчитывается.
Поэтому единственный логический вывод заключается в том, чтоу вас есть циклическое лицо -> отчеты для -> ..-> лица.Это может быть даже в одной записи.
Этот запрос найдет циклы в отчетах для записей:
declare @PersonnelNumber int
set @PersonnelNumber = 10
;with CTE as (
select 1 Level,
convert(varchar(max),@PersonnelNumber) Seed,
'>>' + convert(varchar(max),@PersonnelNumber) + '>>' Path
union all
SELECT Level+1,
convert(varchar(max),ReportsToPersonnelNbr),
Path + convert(varchar(max),ReportsToPersonnelNbr) + '>>'
FROM ReportsTo
join CTE on CTE.Seed = ReportsTo.PersonnelNumber
where Level < 40
)
select *
from CTE
where Len(Replace(Path, '>' + convert(varchar(max),Seed) + '>', ''))
= LEN(Path) - Len('>' + convert(varchar(max),Seed) + '>') * 2