可能重复:
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列表。问题是,当参数有一个数字时它是有效的 - 如果有多个,那么它不返回任何行。有什么想法吗?
答案 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。您实际上会传入一组表值。