Ambas as strings devem ser divididas em suas partes. No SQL-Server 2008, é melhor fazer isso com uma abordagem XML.
atenção :se seus dados podem incluir caracteres proibidos como
<>öä@€&
e não apenas caracteres latinos simples como no seu exemplo, você precisaria de um esforço extra ... O resto é bem fácil:basta pegar todas as partes de
@String1
que não são encontrados em @String2
. O resultado concatenado é - novamente - melhor ser feito via XML
Tente isto:
Declare @String1 as varchar(100)='a,b,c,d,e';
Declare @String2 as varchar(100)='b,e';
WITH FirstStringSplit(S1) AS
(
SELECT CAST('<x>' + REPLACE(@String1,',','</x><x>') + '</x>' AS XML)
)
,SecondStringSplit(S2) AS
(
SELECT CAST('<x>' + REPLACE(@String2,',','</x><x>') + '</x>' AS XML)
)
SELECT STUFF(
(
SELECT ',' + part1.value('.','nvarchar(max)')
FROM FirstStringSplit
CROSS APPLY S1.nodes('/x') AS A(part1)
WHERE part1.value('.','nvarchar(max)') NOT IN(SELECT B.part2.value('.','nvarchar(max)')
FROM SecondStringSplit
CROSS APPLY S2.nodes('/x') AS B(part2)
)
FOR XML PATH('')
),1,1,'')