Tsql SQL不喜欢与动态列表进行比较

Tsql SQL不喜欢与动态列表进行比较,tsql,stored-procedures,Tsql,Stored Procedures,在处理一个新的TSQL存储过程时,我希望获得所有行,其中特定列中的值不以任何一组特定的2个字符子字符串开头 总的想法是: 从表中选择*,其中值不类似于“s1%”,值不类似于“s2%”,值不类似于“s3%” 问题是,我正在尝试将其动态化,以便可以从数据库中的另一个表中提取特定的子字符串,该表可以添加更多的值 虽然我以前从未使用过IN运算符,但我认为沿着这些线应该可以实现我所寻找的功能,但是,我认为不可能将通配符与IN一起使用,因此我可能无法仅比较子字符串 从表中选择*其中值不在从子表中选择子字符串

在处理一个新的TSQL存储过程时,我希望获得所有行,其中特定列中的值不以任何一组特定的2个字符子字符串开头

总的想法是:

从表中选择*,其中值不类似于“s1%”,值不类似于“s2%”,值不类似于“s3%”

问题是,我正在尝试将其动态化,以便可以从数据库中的另一个表中提取特定的子字符串,该表可以添加更多的值

虽然我以前从未使用过IN运算符,但我认为沿着这些线应该可以实现我所寻找的功能,但是,我认为不可能将通配符与IN一起使用,因此我可能无法仅比较子字符串

从表中选择*其中值不在从子表中选择子字符串中

为了绕过这一限制,我尝试做如下工作:

从表中选择*,其中SUBSTRINGvalue、1、2不在SELECT Prefix FROM SUBSTABLE中,其中Prefix不为NULL


但我不确定这是否正确,或者这是否是最有效的方法。我倾向于在存储过程中执行此操作,但如果这不可行或效率不高,我也愿意在C中动态构建查询。

这里有一个选项。将要筛选的值加载到表中,左外部联接并使用


有趣的我以前从未使用过PATINDEX或IN,所以我可能需要同时使用它们。其中一个比另一个有性能优势吗?您可能会看到类似的性能。测试并检查您的执行计划。如果需要的话,带有PATINDEX的左侧外部将为您提供更大的灵活性,因为您不会被限制为仅计算要检查的字段的前2个字符。
DECLARE @FilterValues TABLE
    (
        [FilterValue] NVARCHAR(10)
    );

--Table with values we want filter on.
INSERT INTO @FilterValues (
                              [FilterValue]
                          )
VALUES ( N's1' )
     , ( N's2' )
     , ( N's3' );

DECLARE @TestData TABLE
    (
        [TestValues] NVARCHAR(100)
    );

--Load some test data
INSERT INTO @TestData (
                          [TestValues]
                      )
VALUES ( N's1 Test Data' )
     , ( N's2 Test Data' )
     , ( N's3 Test Data' )
     , ( N'test data not filtered out' )
     , ( N'test data not filtered out 1' );


SELECT          a.*
FROM            @TestData [a]
LEFT OUTER JOIN @FilterValues [b]
    ON PATINDEX([b].[FilterValue] + '%', [a].[TestValues]) > 0
WHERE           [b].[FilterValue] IS NULL;