tsql - 存储过程是否可以在 “IN”子句中​​使用动态参数?

标签 tsql stored-procedures dynamic-sql

我想运行这样的查询:

 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/

相关文章:

sql - T-Sql 获取行数相同的值

SQL 查询变量 nvarchar(max) 不能存储超过 4000 个字符

sql-server-2008 - T-SQL : Export to new Excel file

mysql - 在 if/else block 内创建表的问题

linq-to-sql - LINQ to SQL —无法修改存储过程的返回类型

php - 编辑 2 - 用于清除和转义动态 MySQL 中使用的任何变量的 PHP 函数 - 我的代码

sql - quote_ident() 不向列名添加引号 "first"

sql-server - 直接或通过中介将第三个表与第一个表连接

mysql程序-运行总计

sql - 在动态 sql PostgreSQL 中创建函数