最近寫一段程式 要求向預存程序傳遞一個字串數組或者集合 然後通過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',','
結果是一樣的 .
1
2
3
4
5
6
7
8
8
9
9