存储过程IN参数疑难问题解决方法
2012-02-01 10:44
141 查看
首先,我不会令大家失望,真想解决问题的认真往下看
很久很久以前,我在使用Server的存储过程时,遇到一个问题,就是,IN(@ids)这样的语句执行不了,其实是可以执行的,很多人提出的解决方案是,EXEC(SQL),但对于像我这样的很多人来说,本来存储过程效率高是因为他预执行了一次(据说是,没验证过),反正SQL Server肯定对他有一定的优化方案。而如果使用EXEC(SQL)相当于还要临时组合一下,最后执行的却是SQL语句而已,所以这种方案,不可行,至少对我来说不可行。
今天又遇到这样的问题,你说我存储过程都写了这么一长段了,我再set 一下,把他们都放''里再改下,那多郁闷,通过分析:既然IN里的内容可以自己写如in(1,2,3)或in('我','是','柳','永法')或是in(select id from tablename)。那就是说,前两种就是我现在遇到的问题,怎么传值进去都不行,那看来只有打最后一种方法的主意了。
就是说,只要in 里能把我传进来的值变成一个类似表的形式就OK了。呵呵,正好前段时间研究了个函数,现在感觉应该能用上。试了下,OK一切搞定,贴上来与大家共享,原作者不知道是谁了,在些谢过。
view plaincopy to clipboardprint?
--From http://www.yongfa365.com/Item/PROCEDURE-IN-SQL-Server.html --引用 Select * From Split('1,2,3' , ',')
--引用 Select * From Split('我,是,www.yongfa365.com' , ',')
CREATE FUNCTION [dbo].[Split]
(
@c VARCHAR(MAX) ,
@split VARCHAR(50)
)
RETURNS @t TABLE ( col VARCHAR(50) )
AS
BEGIN
WHILE ( CHARINDEX(@split, @c) <> 0 )
BEGIN
INSERT @t( col )
VALUES ( SUBSTRING(@c, 1, CHARINDEX(@split, @c) - 1) )
SET @c = STUFF(@c, 1, CHARINDEX(@split, @c), '')
END
INSERT @t( col ) VALUES ( @c )
RETURN
END
在SQL Server Management Studio里执行这个(我使用的是SQL Server 2005如果是SQL 2000这个函数要改些内容如:VARCHAR(MAX)),会生成一个表值函数,然后使用时呢,比如你想实现:In(@ids)这时可以换成In(select * from Split(@ids , ','))
这个函数的作用呢,就是把你输入的字符按一定的分隔符分开,并放在一个表里的一列里,然后返回。
OK,存储过程IN参数疑难问题 是不是解决了呢,以后再遇到不用执行那个函数了,只要稍加改造你的存储过程就OK了。
如果你觉得还不够简单或者没看会,建议你直接操作。还是不会,那只能说你不够心静!
很久很久以前,我在使用Server的存储过程时,遇到一个问题,就是,IN(@ids)这样的语句执行不了,其实是可以执行的,很多人提出的解决方案是,EXEC(SQL),但对于像我这样的很多人来说,本来存储过程效率高是因为他预执行了一次(据说是,没验证过),反正SQL Server肯定对他有一定的优化方案。而如果使用EXEC(SQL)相当于还要临时组合一下,最后执行的却是SQL语句而已,所以这种方案,不可行,至少对我来说不可行。
今天又遇到这样的问题,你说我存储过程都写了这么一长段了,我再set 一下,把他们都放''里再改下,那多郁闷,通过分析:既然IN里的内容可以自己写如in(1,2,3)或in('我','是','柳','永法')或是in(select id from tablename)。那就是说,前两种就是我现在遇到的问题,怎么传值进去都不行,那看来只有打最后一种方法的主意了。
就是说,只要in 里能把我传进来的值变成一个类似表的形式就OK了。呵呵,正好前段时间研究了个函数,现在感觉应该能用上。试了下,OK一切搞定,贴上来与大家共享,原作者不知道是谁了,在些谢过。
view plaincopy to clipboardprint?
--From http://www.yongfa365.com/Item/PROCEDURE-IN-SQL-Server.html --引用 Select * From Split('1,2,3' , ',')
--引用 Select * From Split('我,是,www.yongfa365.com' , ',')
CREATE FUNCTION [dbo].[Split]
(
@c VARCHAR(MAX) ,
@split VARCHAR(50)
)
RETURNS @t TABLE ( col VARCHAR(50) )
AS
BEGIN
WHILE ( CHARINDEX(@split, @c) <> 0 )
BEGIN
INSERT @t( col )
VALUES ( SUBSTRING(@c, 1, CHARINDEX(@split, @c) - 1) )
SET @c = STUFF(@c, 1, CHARINDEX(@split, @c), '')
END
INSERT @t( col ) VALUES ( @c )
RETURN
END
在SQL Server Management Studio里执行这个(我使用的是SQL Server 2005如果是SQL 2000这个函数要改些内容如:VARCHAR(MAX)),会生成一个表值函数,然后使用时呢,比如你想实现:In(@ids)这时可以换成In(select * from Split(@ids , ','))
这个函数的作用呢,就是把你输入的字符按一定的分隔符分开,并放在一个表里的一列里,然后返回。
OK,存储过程IN参数疑难问题 是不是解决了呢,以后再遇到不用执行那个函数了,只要稍加改造你的存储过程就OK了。
如果你觉得还不够简单或者没看会,建议你直接操作。还是不会,那只能说你不够心静!
相关文章推荐
- 存储过程使用逗号分隔作为IN参数疑难问题解决方法【真正解决】
- unknown field ‘ioctl’ specified in initializer 问题解决方法
- Javascript无参数和有参数类继承问题解决方法
- java.lang.Exception: 索引中丢失 IN 或 OUT 参数::2 解决方法
- 参数为集合时,mybatis3 分页查询问题及其对应的解决方法
- 优化MySQL开启skip-name-resolve参数时显示“ignored in --skip-name-resolve mode.”Warning解决方法
- 不能对存储过程进行单步调试的问题解决方法
- Net反射技术应用解决对象不同版本方法不同参数的问题(转)
- Net反射技术应用解决对象不同版本方法不同参数的问题
- url传递参数时遇到的乱码问题解决方法
- 【转】Keil调试局部变量显示"not in scope"的问题解决方法
- 开发新浪微博应用出现以下问题Fatal error:Call to undefined function curl_init() in错误的解决方法
- 【开源自动化测试疑难FAQ】【WebDriver】封装GET方法来解决页面跳转不稳定的问题
- springMvc IE浏览器 前台中文参数 乱码问题解决方法
- This file is already open in an editor问题的解决方法
- 解决get方法传递URL参数中文乱码问题
- 解决get方法传递URL参数中文乱码问题
- Rundll32.exe参数传递问题解决方法
- 解决get方法传递URL参数中文乱码问题
- 解决spring mvc获取不到PUT方法参数问题