¿Cómo limitar la profundidad de recursión de CTE pero seleccionar una tabla genérica?

Actualmente tenemos un procedimiento almacenado que devuelve datos de una tabla en su esquema original haciendo algo como esto:

WITH CTE AS
(
    -- Start CTE off by selecting the id that was provided to stored procedure.
    SELECT *
    FROM [dbo].[TestTable]
    WHERE [Id] = 1
    -- Recursively add tasks that are children of records already found in previous iterations.
    UNION ALL
    SELECT t.*
    FROM [dbo].[TestTable] as t
    INNER JOIN CTE as tcte
        ON t.[ParentId] = tcte.[Id]
)           
SELECT *
FROM CTE

Esto es bueno, porque no importa cómo cambie el esquema de la tabla, siempre que haya columnas [Id] y [ParentId], no tendré que actualizar este procedimiento almacenado. Me gustaría hacer algo similar, pero también poder especificar dinámicamente la profundidad de la recursión. La única forma en que he visto hacer esto es agregar un identificador de nivel / profundidad de esta manera:

WITH CTE AS
(
    -- Start CTE off by selecting the task that was provided to stored procedure.
    SELECT *, 0 as [Level]
    FROM [dbo].[TestTable]
    WHERE [Id] = 1
    -- Recursively add tasks that are children of parent tasks that have already been found in previous iterations.
    UNION ALL
    SELECT t.*, [Level] + 1
    FROM [dbo].[TestTable] as t
    INNER JOIN CTE as tcte
        ON t.[ParentId] = tcte.[Id]
    WHERE [Level] < 2
)           
SELECT *
FROM CTE

Esto funciona bien, pero elimina la mayor ventaja de la consulta anterior desde que seleccionó* al final también me dará el nivel. ¿Hay alguna otra forma de hacer esto donde podría especificar un nivel, pero también seleccionar genéricamente todas las columnas de la tabla? Gracias por adelantado

Respuestas a la pregunta(2)

Su respuesta a la pregunta