• DECLARE @BOM TABLE (Product varchar(11), Part varchar(11))

    INSERT INTO @BOM SELECT 'StockCode1', 'StockCode2'

    UNION ALL SELECT 'StockCode1', 'StockCode3'

    UNION ALL SELECT 'StockCode1', 'StockCode4'

    UNION ALL SELECT 'StockCode1', 'StockCode5'

    UNION ALL SELECT 'StockCode2', 'StockCode10'

    UNION ALL SELECT 'StockCode2', 'StockCode11'

    UNION ALL SELECT 'StockCode2', 'StockCode12'

    UNION ALL SELECT 'StockCode12', 'StockCode20'

    DECLARE @T1 TABLE (Product varchar(11), Part varchar(11))

    DECLARE @T2 TABLE (Product varchar(11), NewPart varchar(11), OldPart varchar(11))

    INSERT INTO @T1 SELECT Product, Part FROM @BOM

    INSERT INTO @T2 SELECT A.Product, B.Part, A.Part FROM @T1 A INNER JOIN @BOM B ON B.Product = A.Part

    WHILE (SELECT COUNT(*) FROM @T2) > 0

    BEGIN

    INSERT INTO @T1 SELECT Product, NewPart FROM @T2

    DELETE A FROM @T1 A WHERE EXISTS (SELECT * FROM @T2 Z WHERE Z.Product = A.Product AND Z.OldPart = A.Part)

    DELETE A FROM @T1 A WHERE A.Product IN (SELECT Z.OldPart FROM @T2 Z)

    DELETE FROM @T2

    INSERT INTO @T2 SELECT A.Product, B.Part, A.Part FROM @T1 A INNER JOIN @BOM B ON B.Product = A.Part

    END

    SELECT Product, Part FROM @T1 ORDER BY Product, Part