失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 存储过程IN参数疑难问题解决方法【真正解决】

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

时间:2020-03-21 18:10:26

相关推荐

存储过程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/Item/PROCEDURE-IN-SQL-Server.html

--引用Select*FromSplit('1,2,3',',')

--引用Select*FromSplit('我,是,',',')

CREATEFUNCTION[dbo].[Split]

(

@cVARCHAR(MAX),

@splitVARCHAR(50)

)

RETURNS@tTABLE(colVARCHAR(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 如果是SQL 2000这个函数要改些内容如:VARCHAR(MAX)),会生成一个表值函数,然后使用时呢,比如你想实现:In(@ids)这时可以换成 In(select * from Split(@ids , ','))

这个函数的作用呢,就是把你输入的字符按一定的分隔符分开,并放在一个表里的一列里,然后返回。

OK,存储过程IN参数疑难问题 是不是解决了呢,以后再遇到不用执行那个函数了,只要稍加改造你的存储过程就OK了。

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

stuff函数的解释:

Select stuff("abcdef",2,3,"ghijk")

go

结果:aghijk

stuff的功能:删除指定长度的字符串并在指定的起始点插入另一组字符

STUFF(character_expression,start,length,character_expression)

character_expression :操作的字符,

start:删除和插入的起始点,

length:删除的长度,

character_expression :要插入的字符

-------------------------------------------------------------------------------------------

select patindex('%jinweida%','123jinweida54')

go

结果:4

功能:返回模式在字符串中第一次出现的位置

patindex( '%pattern%' ,expression)

pattern:要查找的模式

expression:被找的字符串

如果觉得《存储过程IN参数疑难问题解决方法【真正解决】》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。