存储过程是否可以在"IN"子句中使用动态参数?

ora*_*dov 6 t-sql stored-procedures dynamic-sql

我想运行这样的查询:

 SELECT * FROM Studio WHERE Id IN (134, 144, 132, 138, 7432, 7543, 2566)
Run Code Online (Sandbox Code Playgroud)

但传递给IN子句的Id数量仅在运行时确定.

我是否必须使用动态SQL,还是可以使用存储过程完成?

更新: 如果有可用的选项,哪一个更好?

谢谢.

Jam*_*ers 8

根据您的Sql Server版本,您可以通过两种不同的方式执行此操作.

对于Sql 2000/2005,您可以使用具有分隔的ID列表的参数(类型varchar).创建一个UDF,它将解析varchar并返回包含这些项的表.然后让你的IN子句反对表(即... IN(选择ID FROM @ReturnTable)).

以下是UDF内容的示例:http: //pietschsoft.com/post/2006/02/03/T-SQL-Parse-a-delimited-string.aspx

对于Sql 2008,你可以做同样的事情; 但是,不是传入varchar参数,而是可以切换到追逐并传入Table参数.IN子句仍然有一个子查询,但它可以完全相同.或者,一旦你有了表,你就可以对它进行内部连接并避免对IN子句的需要.

编辑:添加UDF以解析分隔的字符串链接.


A-K*_*A-K 5

解决方案如下:

SQL Server 2005中的数组和列表

SQL Server MVP的Erland Sommarskog撰写的SQL文本

http://www.sommarskog.se/arrays-in-sql-2005.html