Если мы примем, что начальный CTE берет идентификатор и перечисляет всех «предков» этого идентификатора, я думаю, что следующий запрос проверяет это отношение.
WITH cte As
(
SELECT
UserId,
Forename,
Surname
FROM
dbo.Users
WHERE
UserId = @Id
UNION ALL
SELECT
T.UserID,
T.Forename,
T.Surname
FROM
cte As C INNER JOIN dbo.Users As T
ON C.UserID = T.ManagerID and C.UserID <> @ancestorID
)
SELECT CAST (COUNT(*) as BIT) FROM cte WHERE UserID = @ancestorID
Это немного странно, поскольку, учитывая начальную функцию, человек находится в «предковом» отношении к себе.
Кстати, я удалил ManagerID из операторов выбора вCTE, поскольку это не нужно