Cả hai chuỗi phải được chia thành các phần của chúng. Trong SQL-Server 2008, điều này tốt nhất nên được thực hiện bằng cách tiếp cận XML.
chú ý :Nếu dữ liệu của bạn có thể bao gồm các ký tự bị cấm như <>öä@€&
và không chỉ là các ký tự latin đơn thuần như trong ví dụ của bạn, bạn sẽ cần thêm một số nỗ lực ...
Phần còn lại khá dễ dàng:Chỉ cần lấy tất cả các phần của @String1
không tìm thấy trong @String2
.
Kết quả nối - một lần nữa - tốt nhất nên được thực hiện qua XML
Hãy thử điều này:
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,'')