首页 > 在存储过程中如何实现将ID列表字符串传入IN()

在存储过程中如何实现将ID列表字符串传入IN()

我们在平常编写sql语句时,经常碰到要把id列表字符串(比如:'001,002,003,....')当做参数传递给存储过程,

那么在存储过程中要用in作为条件进行记录的过滤,那么采用in(@idList),其中@idList如'001,002,003,....'。这样执行存储过程就会出错,显然这种传递方法是不可行的(除非@idList只有一个id如'001'),

今天晚上和导师尝试了很多中办法,还是没解决。在不断的讨论中,突然有个灵感:就是采用临时表,

把这些id一个一个存在临时表中(这个需要点技巧,后面给出代码),然后这样调用in:in(select id from #tbIdList)

,其中#tbIdList 为保存了id的临时表。

CREATE TABLE #tbUserId(userID int)

  DECLARE @userID varchar(20)

  WHILE(charindex(',',@Key) >0)

  BEGIN

  SET @userID = substring(@Key,0,charindex(',',@Key))

  SET @Key = substring(@Key,charindex(',',@Key)+1,len(@Key))

  INSERT INTO #tbUserId(userID) VALUES(@userID)

  END

   INSERT INTO #tbUserId(userID) VALUES(@Key)

例子:@Key='0001,0002,0003'

调用:SELECT * FROM tbUser WHERE userID IN (SELECT userID FROM #tbUserId)

 后来有同事问我效率怎样? 我去查了一下in的效率,发现建议使用exists不使用in,而上面的语句系统会自动转换为

Exists(Select * from #tbUserId where tbUser.userID  = userID),所以效率是没问题的。

可是如果IN后面查询语句涉及到多个条件且和外表相关时此时采用Exists效率更好。

http://www.cnblogs.com/zhangchenliang/archive/2010/01/10/1643584.html

转载于:https://www.cnblogs.com/sjaroom/p/3199820.html

更多相关:

  • 练习:用户输入姓名、年龄、工作、爱好 ,然后打印成以下格式------------ info of Egon -----------Name  : EgonAge   : 22Sex   : maleJob   : Teacher ------------- end -----------------完成情况:in_name=inpu...

  •   语法 它通过{}和:来代替%。 “映射”示例 通过位置 In [1]: '{0},{1}'.format('kzc',18) Out[1]: 'kzc,18' In [2]: '{},{}'.format('kzc',18) Out[2]: 'kzc,18' In [3]: '{1},{0},{1}'.forma...

  • --------------------------------------------------------------------------------------- 本系列文章为《机器学习实战》学习笔记,内容整理自书本,网络以及自己的理解,如有错误欢迎指正。 源码在Python3.5上测试均通过,代码及数据 --> http...

  • 首先运行easy_install pymongo命令安装pymongo驱动。然后执行操作: 创建连接 1 In [1]: import pymongo 2 3 In [2]: connection = pymongo.Connection('localhost', 27017) 切换到数据库malware In [3]: db...

  • 代码: public class Person{public int ID { get; set; }public string Name { get; set; }public int Age { get; set; } }public class Dog{public int ID { get; set; }...