在存储过程中如何实现将id列表字符串传入in()
2010-07-06 16:01
369 查看
我们在平常编写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效率更好。
/article/4836060.html
那么在存储过程中要用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效率更好。
/article/4836060.html
相关文章推荐
- 在存储过程中如何实现将id列表字符串传入in()
- 如何传值给存储过程中的In条件?(根据多个id查找对应的记录的处理)
- postgresql 写存储过程传入的参数为字符串('4,5,6,8,9,10')个数不确定时,如何一次性删除
- MySQL 存储过程传参数实现where id in('40288c81494f088601494f92938d0002,40288c81494f088601494f92938d0012,')示例
- MySQL 存储过程传参数问题:实现 where id in(1,2,3,...)
- MySQL 存储过程传参数问题:实现 where id in(1,2,3,...)
- MySQL 存储过程传参数实现where id in(1,2,3,...)示例
- MySQL 存储过程传参数实现where id in(1,2,3,...)示例
- MySQL 存储过程传参数问题:实现 where id in(1,2,3,...)
- MySQL 存储过程传参数实现where id in(1,2,3,...)示例
- MySQL 存储过程传参数问题:实现 where id in(1,2,3,...)
- SQLServer 存储过程中不拼接SQL字符串实现多条件查询
- 如何在JAVA程序中使用Struct一次传入多条数据给Oracle的存储过程。
- 存储过程里面使用in变量列表异常的处理
- 字符串缓存实现的通用分页存储过程
- java 如何实现和调用 mysql存储过程
- 在存储过程中如何拼接字符串参数
- SQLServer 存储过程中不拼接SQL字符串实现多条件查询
- MySQL 存储过程带in和out参数以及PHP,PB如何调用的小例子
- SQLServer 存储过程中不拼接SQL字符串实现多条件查询