背景:
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直接使用第一種方法即可,
復雜寫的可以使用第二方法。
也可以使用臨時表的方法,
不過依然需要先切割字符串。