Если это SQL Server 2005+, используйте встроенный TVF, содержащий рекурсивный CTE.Пример ниже.
USE tempdb;
CREATE TABLE dbo.EquipElement(
EquipmentID int not null primary key,
ContainedIn int null references EquipElement(EquipmentID),
Description varchar(20))
INSERT INTO dbo.EquipElement
SELECT 1, NULL, 'Breakfast' UNION ALL
SELECT 2, 1, 'Fry Up' UNION ALL
SELECT 3, 1, 'Coffee' UNION ALL
SELECT 4, 2, 'Eggs' UNION ALL
SELECT 5, 2, 'Bacon' UNION ALL
SELECT 6, 2, 'Sausages' UNION ALL
SELECT 7, 3, 'Milk' UNION ALL
SELECT 8, 3, 'Sugar'
GO
CREATE FUNCTION dbo.GetBOM
(
@EquipmentID int
)
RETURNS TABLE
AS
RETURN
(
WITH cte AS
(
SELECT EquipmentID,ContainedIn,Description
FROM dbo.EquipElement
WHERE EquipmentID = @EquipmentID
UNION ALL
SELECT e.EquipmentID,e.ContainedIn,e.Description
FROM dbo.EquipElement e
JOIN cte c on e.ContainedIn = c.EquipmentID
)
SELECT EquipmentID,ContainedIn,Description
FROM cte
)
GO
SELECT * FROM dbo.GetBOM(1)
SELECT * FROM dbo.GetBOM(3)