Начиная с SQL Server 2017, вы можете использовать STRING_AGG
(подробнее здесь ) вместе с STRING_SPLIT
, чтобы разбить ваши предложения на слова, заменить имена на ***, а затем объединить обратно отдельные словав предложения:
select co.id,
string_agg(case when p.personname is null then c.value else '***' end,' ') as comment
from @Comments co
cross apply string_split(comment,' ') c
left join @People p on p.personname = c.value
group by co.id
Результаты:

Если у вас есть символы, отличные от пробелов между словами, вы можете заменить их пробеламидо разделения:
DECLARE @Comments TABLE (id INT, comment VARCHAR(50))
INSERT INTO @Comments VALUES
(1, 'Bob (is a sales person)')
, (2, '(Shane:is-a-nice-guy)')
, (3, 'This.is(Mark),he.is-a-nice-guy,too')
DECLARE @People TABLE (personname VARCHAR(50))
INSERT INTO @People VALUES ('Bob'), ('Mark'), ('Shane')
select co.id,
trim(string_agg(case when p.personname is null then c.value else '***' end,' ')) as comment
from
(
select id, replace(replace(replace(replace(replace(replace(comment,':',' '),')',' '),'(',' '),',',' '),'.',' '),'-',' ') as comment
from @Comments
) co
cross apply string_split(comment,' ') c
left join @People p on p.personname = c.value
group by co.id
Теперь с таким типом ввода:

вы получите этот вывод:
