近在一項目修改中,要在存儲過程中給in參數傳值,語句寫的也對,但怎么執行都得不出結果,如果把這語句直接賦值、執行,卻能得出結果,很是奇怪,如:
直接執行select schoolname from school_info where code in('01','02'),是可以得出結果的,但在存儲過程中,使用
declare @area varchar(120);
set @area='01'+','+'02';
select schoolname from school_info where code in(@area),卻得不出去結果。
set @area='01'+','+'02';
select schoolname from school_info where code in(@area),卻得不出去結果。
想着可能是@area賦值的寫法有問題,但試過多種辦法都不行。嘗試着用組成動態sql語句, 用exec執行的方法,是沒有問題,能得出結果的,但總感覺這樣有點怪怪的,不是想要的理想中解決辦法。
后來終於在網上找一個解決辦法,測試后,沒有問題,用着很方便。就是建一個函數,建好后,列在函數的表值函數下面,語句如下:
create function [dbo].[f_split](@c varchar(2000),@split varchar(2)) returns @t table(col varchar(20)) 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
然后使用的時候呢,語句如下:
select schoolname from school_info where code in(select col from [dbo].[f_split](@area,','))
這樣再執行存儲過程,給in傳入帶逗號值的參數,都能正確得出結果了