• Here is the solution to this problem, which works correctly (credit to Steve Kass: http://stackoverflow.com/users/139164/steve-kass):

    WITH cte(CarID,hier) AS (

    SELECT CarID, CAST('/'+LTRIM(CarID)+'/' AS varchar(max))

    FROM Car

    WHERE CarName = @StartCar

    UNION ALL

    SELECT c2.CarID, hier+LTRIM(c2.CarID)+'/'

    FROM Car AS c

    JOIN cte ON cte.CarID = c.CarID

    JOIN CarPart AS c1 ON c.CarID = c1.CarID

    JOIN CarPart AS c2 ON c2.PartName = c1.PartName

    WHERE hier NOT LIKE '%/'+LTRIM(c2.CarID)+'/%'

    )

    SELECT

    c.CarName, cp.PartName

    FROM Car AS c

    JOIN CarPart AS cp ON cp.CarID = c.CarID

    JOIN cte on cte.CarID = c.CarID