Sql server T-SQL-验证select语句的结果中是否包含所有值

Sql server T-SQL-验证select语句的结果中是否包含所有值,sql-server,tsql,split,sql-server-2016,Sql Server,Tsql,Split,Sql Server 2016,假设我有一个函数,我在其中传递一个逗号分隔的值列表。然后我有另一个函数,它返回一个表。如何验证逗号分隔列表中的每个值是否包含在第二个函数的结果中?如果逗号分隔列表包含的值不在第二个函数的结果中,则结果必须为FALSE 有效场景: 输入:A、B、C 第二个函数的结果:A、B、C、D 无效场景: 输入:A、B、C、D 第二个函数的结果:A、B、C 提前谢谢。类似这样的内容: DECLARE @input VARCHAR(100)='1,3,4'; WITH splittedInput AS (

假设我有一个函数,我在其中传递一个逗号分隔的值列表。然后我有另一个函数,它返回一个表。如何验证逗号分隔列表中的每个值是否包含在第二个函数的结果中?如果逗号分隔列表包含的值不在第二个函数的结果中,则结果必须为FALSE

有效场景:

输入:A、B、C

第二个函数的结果:A、B、C、D

无效场景:

输入:A、B、C、D

第二个函数的结果:A、B、C

提前谢谢。

类似这样的内容:

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;
如果需要,您将获得一个标记有效性的
0
1
,以返回此值

更新2:使用
STRING\u SPLIT()
2016版MS引入了一些新的字符串方法

我目前无法测试这一点(需要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;

谢谢你。是的,我们使用SQL Server 2016+@Draženjanjikček请注意,在T-SQL中,用逗号分隔的列表对多个数据项进行建模不是一种好方法。T-SQL的类型设计用于保存多个值(表本身、XML、JSON)。使用一个不是为保存多个值而设计的类型(比如一个包含逗号和其他必须解析或分解的字符的字符串)只会给您的工作增加复杂性。
SELECT CASE WHEN COUNT(*)>0 THEN 0 ELSE 1 END AS ResultIsValid
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;