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,还是可以使用存储过程完成?
更新: 如果有可用的选项,哪一个更好?
谢谢.
根据您的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以解析分隔的字符串链接.
解决方案如下:
SQL Server 2005中的数组和列表
SQL Server MVP的Erland Sommarskog撰写的SQL文本
http://www.sommarskog.se/arrays-in-sql-2005.html