一、场景说明:
1、报表需要对同一个参数同时输入多个值进行查询
2、报表参数:字符串格式;参数的每个值之间以特定的符号隔开,以下以逗号(,)为示例进行
二、存储过程调用实现
1、必备函数
函数 GO CREATE function Get_StrArrayLength ( @str varchar(1024), --要分割的字符串 @split varchar(10) --分隔符号 ) returns int as begin declare @location int declare @start int declare @length int set @str=ltrim(rtrim(@str)) set @location=charindex(@split,@str) set @length=1 while @location<>0 begin set @start=@location+1 set @location=charindex(@split,@str,@start) set @length=@length+1 end return @length end --调用示例:select dbo.Get_StrArrayLength('6,5,9,3',',') --返回值:4 GO CREATE function Get_StrArrayStrOfIndex ( @str varchar(1024), --要分割的字符串 @split varchar(10), --分隔符号 @index int --取第几个元素 ) returns varchar(1024) as begin declare @location int declare @start int declare @next int declare @seed int set @str=ltrim(rtrim(@str)) set @start=1 set @next=1 set @seed=len(@split) set @location=charindex(@split,@str) while @location<>0 and @index>@next begin set @start=@location+@seed set @location=charindex(@split,@str,@start) set @next=@next+1 end if @location =0 select @location =len(@str)+1 --这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。 return substring(@str,@start,@location-@start) end --调用示例:select dbo.Get_StrArrayStrOfIndex('8,9,4',',',2) --返回值:9 GO create function f_splitstr --alter function f_splitstr ( @SourceSql varchar(8000), @StrSeprate varchar(100) ) returns varchar(8000) as begin declare @temp as varchar(8000)='' declare @ch as varchar(100) set @SourceSql=@SourceSql+@StrSeprate while(@SourceSql<>'') begin set @ch=left(@SourceSql,charindex(',',@SourceSql,1)-1) set @temp = @temp + ''''+@ch+'''' + ',' set @SourceSql=stuff(@SourceSql,1,charindex(',',@SourceSql,1),'') end return substring(@temp,0,len(@temp)) end ------调用 -- select [dbo].[f_splitstr]('1,2,3,4',',') -- 结果:'1','2','3','4'
2、存储过程里调用函数的方法
调用函数 declare @sql varchar(5000) = 'select * from #t1 AS A where 1=1 ' if(dbo.fn_isEmpty(@MOLotCode) = 0) set @sql += ' and A.MOLotCode in( '+ [dbo].[f_splitstr](@MOLotCode,',') +')' if(dbo.fn_isEmpty(@modocNo) = 0) set @sql += ' and A.MODocNo in ( '+ [dbo].[f_splitstr](@modocNo,',') +')'
其中@MOLotCode和@modocNo是存储过程传入的参数,格式为:1,2,3,4,5
通过函数f_splitstr解析之后将得到: '1','2','3','4','5' 的格式