T-SQL中的'WHERE IN'

时间:2011-01-19 20:39:00

标签: c# sql tsql

  

可能重复:
  Parameterizing a SQL IN clause?
  Is it possible to use query parameters to fill the IN keyword

嗨,我在我的SQL查询中使用WHERE IN,因为用户可能需要输入多个id来显示记录,用逗号分隔。我现在有这个:

WHERE Consignments.ID IN(@ID) 

其中@ID将是逗号分隔的ID列表。问题是,当参数有一个数字时它是有效的 - 如果有多个,那么它不返回任何行。有什么想法吗?

6 个答案:

答案 0 :(得分:2)

In不能以这种方式使用。您需要通过动态创建SQL来实现此目的。

DECLARE @sql VARCHAR(200);
DECLARE @id VARCHAR(200);

SET @sql = 'SELECT * FROM Table WHERE Consignments.ID IN (' + @id + ')';

EXEC sp_executesql @sql;

答案 1 :(得分:1)

您需要使用动态sql或使用带有表变量的存储过程,如输入变量。

答案 2 :(得分:0)

您需要将参数逗号分隔,而不仅仅是传递逗号分隔的ID字符串。

WHERE Consignments.ID IN(@ID1,@ID2,@ID3,...)

答案 3 :(得分:0)

当必须在IN子句中使用此参数时,不能在SQL语句中使用参数。

原因很简单,当包含多个值时,必须将该参数定义为字符串,因为1,5,6不是有效数字(假设ID是数字字段)。

因此,您必须使用字符串连接才能使其正常工作。

几天前,

This是一个类似的主题。

答案 4 :(得分:0)

它应该是以逗号分隔的值列表或在查询中选择的ID:

WHERE Consignments.ID IN('1','2')
OR
WHERE Consignments.ID IN(SELECT ID FROM <Table | View>)

答案 5 :(得分:0)

您无法将文字逗号分隔值作为要与IN一起使用的参数传递,因为IN会将变量解析为一个集合(一个项目,一个字符串),而不是从中创建一个集合你的文字。

如果你想这样做,你需要将整个语句存储为一个字符串,然后使用EXEC来运行它...这将使你的查询不可思议但易受注入攻击。

如果你有SQL 2008,你应该使用TVP。您实际上会传入一组表值。