С учетом этой функции:
CREATE FUNCTION dbo.SplitStrings ( @List NVARCHAR(MAX) )
RETURNS TABLE
AS
RETURN ( SELECT Item FROM (
SELECT Item = x.i.value('(./text())[1]', 'nvarchar(max)')
FROM (
SELECT [XML] = CONVERT(XML, '<i>' + REPLACE(@List,',', '</i><i>')
+ '</i>').query('.')) AS a CROSS APPLY [XML].nodes('i') AS x(i)
) AS y WHERE Item IS NOT NULL);
GO
Вы можете сделать это с полным внешним объединением:
DECLARE
@list1 NVARCHAR(MAX) = N'a,b,c,123',
@list2 NVARCHAR(MAX) = N'd,e,f,a,asd,c',
@output NVARCHAR(MAX) = N'';
SELECT @output += N',' + COALESCE(l1.Item, l2.Item)
FROM dbo.SplitStrings(@list1) AS l1
FULL OUTER JOIN dbo.SplitStrings(@list2) AS l2
ON l1.Item = l2.Item
WHERE l1.Item IS NULL OR l2.Item IS NULL;
SELECT STUFF(@output, 1, 1, N'');
или аналогично @ JNK's:
DECLARE
@list1 NVARCHAR(MAX) = N'a,b,c,123',
@list2 NVARCHAR(MAX) = N'd,e,f,a,asd,c',
@output NVARCHAR(MAX) = N'';
;WITH l1 AS (SELECT Item FROM dbo.SplitStrings(@list1)),
l2 AS (SELECT Item FROM dbo.SplitStrings(@list2))
SELECT @output += N',' + Item
FROM ( (SELECT Item FROM l1 EXCEPT SELECT Item FROM l2)
UNION
(SELECT Item FROM l2 EXCEPT SELECT Item FROM l1)) AS x;
SELECT STUFF(@output, 1, 1, N'');
И, возможно, множество других способов тоже.Если порядок важен, он будет немного сложнее, но все же возможен.