Мои варианты:
SELECT
txt,
CHARINDEX('_',REVERSE(txt)), -- there is 0 for four last examples
--REPLACE(RIGHT(txt,ISNULL(NULLIF(CHARINDEX('_',REVERSE(txt))-1,-1),LEN(txt))),' (C)','')
-- the next variants is better if we have different count of spaces before '(C)'
RTRIM(REPLACE(RIGHT(txt,ISNULL(NULLIF(CHARINDEX('_',REVERSE(txt))-1,-1),LEN(txt))),'(C)','')),
RTRIM(REPLACE(IIF(CHARINDEX('_',txt)=0,txt,RIGHT(txt,CHARINDEX('_',REVERSE(txt))-1)),'(C)',''))
FROM
(VALUES
('CP04K_54560_633331 (C)'),
('CP04K_54560_641121 (C)'),
('ME030_72159_690940 (C)'),
('HB21M_60966_1181492 (C)'),
('AW000_1144713 (C)'),
(NULL),
(''),
('1234567(C)'),
('1234567 (C)'),
('1234567')
) v(txt)
Вы можете проверить свои данные, используя следующий запрос:
SELECT *
FROM
(VALUES
('CP04K_54560_633331 (C)'),
('CP04K_54560_641121 (C)'),
('ME030_72159_690940 (C)'),
('HB21M_60966_1181492 (C)'),
('AW000_1144713 (C)'),
(NULL),
(''),
('1234567(C)'),
('1234567 (C)'),
('1234567')
) v(txt)
WHERE CHARINDEX('_',txt)=0
Я думаю, что вы получите все значения без '_'.