Это версия, которая использует CTE, чтобы делать то, что вы хотите.
Я создаю таблицу @list, которая содержит предоставленные вами списки, и таблицу anoter @search, содержащую каждое из условий поиска.
declare @list table(k int, l varchar(100))
insert @list values (1,' Joe,Jane')
,(2,'Jane, James,Frank')
,(3,'Jane, Joe,James')
declare @search table(sk int,s varchar(20))
insert @search values (1,'jane'),(2,'joe'),(3,'james')
-- Top level CTE to remove spaces, and each term is surrounded by its own commas.
;with cte as (
select k,','+replace(replace(l,',',',,'),' ','')+',' l from @list
)
-- Go through the search terms recursively and remove the search terms, with their surrounding commas
,cte2 as(
select cte.k, replace(cte.l,','+s+',','') as l, s.sk, s.s
from cte
join @search s on sk=1
union all
select cte2.k, replace(cte2.l,','+s.s+',','') as l, s.sk ,s.s
from cte2
join @search s on s.sk=cte2.sk+1
)
-- Find any that result in zero length
select distinct k from cte2 where len(l)=0