El reemplazo anidado está bien, pero a medida que aumenta el nivel de anidamiento, la legibilidad de su código disminuye. Si tuviera una gran cantidad de caracteres para reemplazar, optaría por algo más limpio como el enfoque basado en tablas a continuación.
declare @Category varchar(25)
set @Category = 'ABC & DEF/GHI, LMN OP'
-- nested replace
select replace(replace(replace(replace(@Category, ' & ', '-'), '/', '-'), ', ', '-'), ' ', '-') as Department
-- table driven
declare @t table (ReplaceThis varchar(10), WithThis varchar(10))
insert into @t
values (' & ', '-'),
('/', '-'),
(', ', '-'),
(' ', '-')
select @Category = replace(@Category, ReplaceThis, isnull(WithThis, ''))
from @t
where charindex(ReplaceThis, @Category) > 0;
select @Category [Department]