最近在一項目修改中,要在存儲過程中給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
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傳入帶逗號值的參數,都能正確得出結果了。