我想运行这样的查询:
SELECT * FROM Studio WHERE Id IN (134, 144, 132, 138, 7432, 7543, 2566)
但是传递给IN子句的 Id 的数量仅在运行时确定。
我必须使用动态SQL还是可以通过存储过程来完成?
更新:
如果有一个选项可用,哪个更好?
谢谢。
最佳答案
根据您的Sql Server版本,您可以使用两种不同的方法之一来执行此操作。
对于Sql 2000/2005,可以使用具有定界ID列表的参数(类型varchar)。创建一个将解析varchar并返回包含项的表的UDF。然后使您的IN子句与该表相反(即... IN(从@ReturnTable选择ID))。
这是UDF内容的示例:
http://pietschsoft.com/post/2006/02/03/T-SQL-Parse-a-delimited-string.aspx
对于Sql 2008,您可以执行相同的操作。但是,除了传递varchar参数外,您还可以直接切入并传递Table参数。 IN子句仍将有一个子查询,但它将完全相同。另外,一旦有了该表,就可以对它执行内部联接并规避对IN子句的需要。
编辑:添加了用于解析分隔的字符串链接的UDF。
关于tsql - 存储过程是否可以在 “IN”子句中使用动态参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/977021/