在使用存储过程时,不可避免会遇到:把一个以逗号分隔的数字字符串当成数组一样传给存储过程,如下:
exec proc_FuckMe '6,7,8';
存储过程SQL中想当然地用where id in (@ID)
这种方式去接传过来的值,会报错的!
解决方案如下代码,在存储过程里面添加一个逻辑,把传进来的值处理一下,然后再给SQL使用:.
declare @StrArray varchar(100),@split varchar(100) --定义@split分隔符,@StrArray需要转换的类似数字数组的字符串 比如6,7,8
set @StrArray=@ID --从存储过程的形参中获取数据
set @split= ',' --设置分隔符
declare @TempTable table(Row int identity(1,1) not null,TempID int) --在内存中定义一个临时表,临时字段TempID
set @StrArray=@StrArray+@split --最后要加个分隔符,
while(charindex(@split,@StrArray)<>0)
begin
insert @TempTable(TempID) values (substring(@StrArray,1,charindex(@split,@StrArray)-1))
set @StrArray = stuff(@StrArray,1,charindex(@split,@StrArray),'')
end
上面处理完后,后面的SQL使用:
select * from Table where id in (select TempID from @TempTable)
select TempID from @TempTable
通过这个SQL获取到转换后的ID数组结果
最后再强调下:存储过程接收'6,7,8'这种像是数组,实际上是以逗号分隔的数字字符串时,对应的参数要命名为varchar(500),不能再命名为int类型。