最近写一段程序 要求向存储过程传递一个字符串数组或者集合 然后通过not in进行条件判断
仔细研究后在csdn上找到了解决该问题的办法帖出来给大家共享一下
大致方法是利用传递长字符串的形式向存储过程传递一个长字符串。由于sqlserver没有 splite函数
所以必须自己定义一个splite函数来进行处理
自定义一个函数
create function f_splitstr(@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(F1 varchar(100))
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>''
insert @temp values(@SourceSql)
return
end
-执行
select * from dbo.f_splitstr('1,2,3,4',',')
注:'1,2,3,4'即你所传递的字符串
同样你可以通过 select cunt(*) from dbo.f_splitstr('1,2,3,4',',')
获得该字符串数组的长度
如果要删除该函数使用
--删除函数
drop function fsplit
*************************************************************************
还有另外一种方法,这是充分利用了SQL Server强大的字符串功能
不过由于用到了exec命令,所以只能在存储过程中实现
create procedure f_splitstr (@SourceSql varchar(8000),@StrSeprate varchar(10))
as
create table #temp (F1 varchar(100))
declare @TmpSql varchar(8000)
select @TmpSql = 'insert into #temp values ('+ replace (@SourceSql,@StrSeprate,')
insert into #temp values (')+')'
exec(@TmpSql)
select * from #temp
drop table #temp
go
f_splitstr4 '1,2,3,4',','
结果是一样的 .