Sql 在数字字段上使用NOT IN

Sql 在数字字段上使用NOT IN,sql,tsql,Sql,Tsql,我想使用一个参数作为NOT IN操作的值,针对一个名为DateID的字段的表;但我不能让它工作。以以下代码为例: DECLARE @NewDateIDs as VARCHAR(1000) SET @NewDateIDs = '66,67,68,69,70' SELECT * FROM MyTable WHERE UserID = 1 AND EventID = 19 AND CONVERT(VARCHAR(1000), DateID) NOT IN(@NewDateIDs) 当我运行上

我想使用一个参数作为NOT IN操作的值,针对一个名为DateID的字段的表;但我不能让它工作。以以下代码为例:

DECLARE @NewDateIDs as VARCHAR(1000)

SET @NewDateIDs = '66,67,68,69,70'

SELECT * FROM MyTable WHERE UserID = 1 AND EventID = 19 AND 
CONVERT(VARCHAR(1000), DateID) NOT IN(@NewDateIDs) 
当我运行上面的select语句时,返回UserID=1和EventID=19的所有记录。应该返回一条记录,其中UserId=1,EventID=19,DateID=65

但是,如果运行下面的select语句,就会得到所需的结果

SELECT * FROM MyTable WHERE UserID = 1 AND EventID = 19 AND 
CONVERT(VARCHAR(1000), DateID) NOT IN(66,67,68,69,70)

我知道我缺少一些基本的东西。有人能告诉我如何正确地执行此操作,以及为什么我尝试的操作不起作用。

您可以使用动态sql查询来实现这一点:

DECLARE @strQuery as VARCHAR(4000)

SET @strQuery = 'SELECT * FROM MyTable WHERE UserID = 1 AND EventID = 19 AND 
DateID NOT IN(' + @NewDateIDs + ')'

EXEC(@strQuery)

您可以使用动态sql查询来实现以下目标:

DECLARE @strQuery as VARCHAR(4000)

SET @strQuery = 'SELECT * FROM MyTable WHERE UserID = 1 AND EventID = 19 AND 
DateID NOT IN(' + @NewDateIDs + ')'

EXEC(@strQuery)

人们似乎对SQL产生了神奇的信念,不知何故,字符串将神奇地变成执行的代码,或变成多个独立的值。它在SQL中不是这样工作的。如果不是一串数字,第二个select语句中的66,67,68,69,70是什么?我对SQL相当陌生,我只是想了解一下。@SteveKrantzman这是一组整数。@SteveKrantzman在第二个选择中,您确实有一个整数值列表。在尝试将DateID与整数列表进行匹配之前,为什么要将其从整数转换为字符串,这是一个谜。第一个选择将匹配任何恰好是字符串“66,67,68,69,70”的DateID,这不太可能。它也可以是“红”、“黄”、“蓝”来匹配任何单一颜色,或者是“红、黄、蓝”来匹配字符串“红、黄、蓝”。人们似乎对SQL产生了神奇的信念,不知何故,字符串将神奇地变成执行的代码,或变成多个独立的值。它在SQL中不是这样工作的。如果不是一串数字,第二个select语句中的66,67,68,69,70是什么?我对SQL相当陌生,我只是想了解一下。@SteveKrantzman这是一组整数。@SteveKrantzman在第二个选择中,您确实有一个整数值列表。在尝试将DateID与整数列表进行匹配之前,为什么要将其从整数转换为字符串,这是一个谜。第一个选择将匹配任何恰好是字符串“66,67,68,69,70”的DateID,这不太可能。它也可以是“红”、“黄”、“蓝”来匹配任何单一颜色,或者“红、黄、蓝”来匹配字符串“红、黄、蓝”。哈迪,我给了你正确的答案,因为它确实为我的问题提供了解决方案。我确实找到了一篇讨论这个话题的好文章:。如果我没有在原始帖子中将DateID转换为字符串,您可能会建议这样做:从MyTable中选择*其中UserID=1,EventID=19,DateID不插入选择convertint,字符串中的值_split@NewDateIDs, ','. 现在我已经有了更好的理解,我将寻找一种比不在中更有效的方法来解决存储过程的总体目标。哈迪,我给了你正确的答案,因为它确实为我的问题提供了解决方案。我确实找到了一篇讨论这个话题的好文章:。如果我没有在原始帖子中将DateID转换为字符串,您可能会建议这样做:从MyTable中选择*其中UserID=1,EventID=19,DateID不插入选择convertint,字符串中的值_split@NewDateIDs, ','. 现在我已经有了更好的理解,我将寻找一种性能更好的方法来解决存储过程的总体目标。