背景:
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直接使用第一种方法即可,
复杂写的可以使用第二方法。
也可以使用临时表的方法,
不过依然需要先切割字符串。