儲存過程IN引數疑難問題解決方法

2022-03-19 05:07:21 字數 1497 閱讀 3157

首先,我不會令大家失望,真想解決問題的認真往下看

很久很久以前,我在使用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 plain

copy to clipboard

print

? --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) ) 

asbegin

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), '') 

endinsert  @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了。

如果你覺得還不夠簡單或者沒看會,建議你直接操作。還是不會,那只能說你不夠心靜!

Django migrate報錯問題解決方案

python3 manage.py makemigrations 生成資料庫遷移檔案 python3 manage.py migrate 遷移資料庫 簡簡單單兩條命令就完成了django的資料庫遷移 但是今天一天的時間都耽誤在這了,一點都不誇張的那種,早上去公司討論需求之後,研究了一下需要更改一下資...

vue axios post 404 問題解決方法

1.在main.js 入口檔案配置 172.20.10.7是我要掉的介面電腦的ip位址 import axios from axios axios.defaults.baseurl 設定乙個類似base url的請求路徑 global.axios axios 設定乙個全域性axios便於呼叫2.然後...

ubuntu mysql遠端連線問題解決方法

今天在配置opennebula 3.8的時候,當執行one start啟動時,報不能連線資料庫的錯誤,但是在shell下輸入mysql uroot p是可以登入的,所以問題應該是mysql不允許root使用者遠端 登入的問題,於是通過輸入下面命令 grant all privileges on to...