DECLARE @partid INT
SELECT @partid = 24796;
WITH parts ( pbom, pid, cbom, cid, lvl, seq, sortseq )
AS ( SELECT NULL ,
p.ParentId ,
p.BomId ,
p.ParentId ,
0 ,
0 ,
0
FROM dbo.bom_parent AS p
JOIN dbo.bom_bom AS b ON b.BomId = p.BomId
WHERE b.VersionEffDate <= GETDATE()
AND b.VersionEndDate > GETDATE()
AND b.BomType = 1
and ParentId=@partid
UNION
SELECT p.BomId ,
p.ParentId ,
cb.BomId ,
c.ComponentId ,
0 AS lvl ,
CAST(ROW_NUMBER() OVER ( PARTITION BY c.BomId ORDER BY c.SortSeq ) AS INT) AS seq ,
c.SortSeq
FROM dbo.bom_parent AS p
JOIN dbo.bom_bom AS b ON b.BomId = p.BomId
JOIN dbo.bom_opcomponent AS c ON c.BomId = p.BomId
LEFT JOIN dbo.bom_parent AS cb ON c.ComponentId = cb.ParentId
LEFT JOIN dbo.bom_bom AS bc ON bc.BomId = cb.BomId
--LEFT JOIN dbo.bom_opcomponentopt bo ON c.OptionsId = bo.OptionsId
WHERE b.VersionEffDate <= GETDATE()
AND b.VersionEndDate > GETDATE() and p.ParentId=@partid
AND ( ( bc.VersionEffDate <= GETDATE()
AND bc.VersionEndDate > GETDATE()
AND bc.BomType = 1
)
OR bc.BomId IS NULL
)
),
bom
AS ( SELECT parts.pid AS ancestor ,
parts.pbom ,
parts.pid ,
parts.cbom ,
parts.cid ,
parts.lvl ,
parts.seq ,
parts.sortseq ,
CAST('01' AS NVARCHAR(50)) AS pseq
FROM parts
WHERE parts.pbom IS NULL
AND parts.pid = @partid
UNION ALL
SELECT p.ancestor ,
c.pbom ,
c.pid ,
c.cbom ,
c.cid ,
p.lvl + 1 ,
c.seq ,
c.sortseq ,
CAST(p.pseq + '.' + RIGHT('00' + CAST(c.seq AS NVARCHAR(50)), 2) AS NVARCHAR(50))
FROM parts AS c
JOIN bom AS p ON p.cbom = c.pbom
)
SELECT *
FROM bom AS b
ORDER BY b.pseq
OPTION ( HASH JOIN, MAXRECURSION 10 );