存储过程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?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了。
??????? 如果你覺得還不夠簡單或者沒看會,建議你直接操作。還是不會,那只能說你不夠心靜!
?
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:被找的字符串
?
?
?
轉載于:https://www.cnblogs.com/jhxk/articles/1802707.html
總結
以上是生活随笔為你收集整理的存储过程IN参数疑难问题解决方法【真正解决】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JSP 中使用Struts2的值
- 下一篇: 【原】TreeView+Checkbox