背景:
1、使用存儲過程
2、存儲過程中有in
3、in括號里面的內容作為參數傳遞
解決方案:
1、直接拼接sql
可在存儲過程中拼接字符串,然后執行此字符串,類似於js中的eval
PROCEDURE [dbo].[INSelect]
@P_0 NVARCHAR(600)
AS
DECLARE @A VARCHAR(6000)
SET @A='SELECT * FROM testTb WHERE zip IN ('+@P_0+')'
然后用系統存儲過程sp_executesql執行@A即可!
2、定義方法將字符切割為集合
切割字符串方法
Create function func_split_hongfei0416j (@SourceSql varchar(8000),@StrSeprate varchar(2))
returns @temp table(col varchar(100))
as
begin
declare @ch as varchar(100)
set @SourceSql=@SourceSql+@StrSeprate
while(@SourceSql<>'')
begin
set @ch=left(@SourceSql,charindex(@StrSeprate,@SourceSql,1)-1)
insert @temp values(@ch)
set @SourceSql=stuff(@SourceSql,1,charindex(@StrSeprate,@SourceSql,1),'')
end
return
end
存儲過程書寫demo
CREATE PROC ps_spit_test
(
@lettertype VARCHAR(100)
)
AS
BEGIN
select * from y_paper
where lettertype in (select Col As lettertype
from dbo.func_split_hongfei0416j(@lettertype,','))
end
exec ps_spit_test '118,148,163'
如果是簡單的sql直接使用第一種方法即可,
復雜寫的可以使用第二方法。
也可以使用臨時表的方法,
不過依然需要先切割字符串。
