注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

和申的个人主页

专注于java开发,1985wanggang

 
 
 

日志

 
 

存储过程IN参数疑难问题解决方法【真正解决】  

2009-12-22 20:23:58|  分类: 数据库 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

存储过程IN参数疑难问题解决方法【真正解决】 - 和申 - 和申的个人主页

淘宝风云榜   居家频道    美容频道    食品频道   男人频道   电器商场    数码频道    电器城频道

存储过程IN参数疑难问题解决方法【真正解决】

        首先,我不会令大家失望,真想解决问题的认真往下看

        很久很久以前,我在使用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一切搞定,贴上来与大家共享,原作者不知道是谁了,在些谢过。

 


--From   
--引用 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了。

        如果你觉得还不够简单或者没看会,建议你直接操作。还是不会,那只能说你不够心静!

引用本页地址:http://www.yongfa365.com/item/PROCEDURE-IN-SQL-Server.html

 

淘宝风云榜   居家频道    美容频道    食品频道   男人频道   电器商场    数码频道    电器城频道
存储过程IN参数疑难问题解决方法【真正解决】 - 和申 - 和申的个人主页

  评论这张
 
阅读(1098)| 评论(3)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016