类似这样的:
DECLARE @input VARCHAR(100)='1,3,4';
WITH splittedInput AS
(
SELECT val.value('text()[1]','int') As theInt
FROM
(
SELECT CAST('<x>' + REPLACE(@input,',','</x><x>') + '</x>' AS XML) AS singleValue
) AS x
CROSS APPLY x.singleValue.nodes('/x') As y(val)
)
SELECT *
FROM splittedInput AS si
LEFT JOIN (VALUES(1),(2),(3),(4)) AS t(x) ON t.x=si.theInt
WHERE t.x IS NULL;
单独运行这部分
SELECT val.value('text()[1]','int') As theInt
FROM
(
SELECT CAST('<x>' + REPLACE(@input,',','</x><x>') + '</x>' AS XML) AS singleValue
) AS x
CROSS APPLY x.singleValue.nodes('/x') As y(val)
您会看到,这会将逗号分隔的输入作为派生表返回。
如果您使用的是 SQL Server 2016+,则可以使用 STRING_SPLIT(),这会使整个事情变得更加简单。
该示例使用VALUES 创建一个模拟结果 以返回1、2、3 和4。LEFT JOIN 将返回所有结果值以及可连接的输入值。如果没有,它将是NULL。在没有WHERE 子句的情况下运行它以查看差异。
尝试为您的输入添加一个值,该值未包含在输出中,然后再次尝试该脚本。
更新
像这样的SELECT
SELECT CASE WHEN COUNT(*)>0 THEN 0 ELSE 1 END AS ResultIsValid
如果需要,您会得到一个 0 或 1 来标记返回的有效性。
更新 2:使用STRING_SPLIT()
MS 在 2016 版中引入了一些新的字符串方法,one of them is STRING_SPIT()。
我目前无法对此进行测试(需要 SQL-Server 2016+),但这应该可以工作
SELECT *
FROM STRING_SPLIT(@input,',') AS ss
LEFT JOIN (VALUES(1),(2),(3),(4)) AS t(x) ON t.x=ss.value
WHERE t.x IS NULL;