WITH OrdersCTE(OrderID, OrderDate)
AS (SELECT SalesOrderID, OrderDate
    FROM Sales.SalesOrderHeader),
OrdersBOMCTE(OrderID, OrderDate, BOM)
AS (SELECT *, CAST(CONVERT(Varchar(6), OrderDate, 112)
                     + '01' AS datetime)
    FROM OrdersCTE),
OrdersBOMEOMCTE(OrderID, OrderDate, BOM, EOM)
AS (SELECT *, DATEADD(day, -1, DATEADD(month, 1, BOM))
    FROM OrdersBOMCTE)
SELECT * FROM OrdersBOMEOMCTE;