--各種字串分函式
if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[f_splitstr]') and xtype in (n'fn', n'if', n'tf'))
drop function [dbo].[f_splitstr]
go--3.2.1 迴圈擷取法
create function f_splitstr(
@s varchar(8000), --待分拆的字串
@split varchar(10) --資料分隔符
)returns @re table(col varchar(100))
asbegin
declare @splitlen int
set @splitlen=len(@split+'a')-2
while charindex(@split,@s)>0
begin
insert @re values(left(@s,charindex(@split,@s)-1))
set @s=stuff(@s,1,charindex(@split,@s)+@splitlen,'')
endinsert @re values(@s)
return
endgo
if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[f_splitstr]') and xtype in (n'fn', n'if', n'tf'))
drop function [dbo].[f_splitstr]
go--3.2.3.1 使用臨時性分拆輔助表法
create function f_splitstr(
@s varchar(8000), --待分拆的字串
@split varchar(10) --資料分隔符
)returns @re table(col varchar(100))
asbegin
--建立分拆處理的輔助表(使用者定義函式中只能操作表變數)
declare @t table(id int identity,b bit)
insert @t(b) select top 8000 0 from syscolumns a,syscolumns b
insert @re select substring(@s,id,charindex(@split,@s+@split,id)-id)
from @t
where id<=len(@s+'a')
and charindex(@split,@split+@s,id)=id
return
endgo
if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[f_splitstr]') and xtype in (n'fn', n'if', n'tf'))
drop function [dbo].[f_splitstr]
goif exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[tb_splitstr]') and objectproperty(id,n'isusertable')=1)
drop table [dbo].[tb_splitstr]
go--3.2.3.2 使用永久性分拆輔助表法
--字串分拆輔助表
select top 8000 id=identity(int,1,1) into dbo.tb_splitstr
from syscolumns a,syscolumns b
go--字串分拆處理函式
create function f_splitstr(
@s varchar(8000), --待分拆的字串
@split varchar(10) --資料分隔符
)returns table
asreturn(
select col=cast(substring(@s,id,charindex(@split,@s+@split,id)-id) as varchar(100))
from tb_splitstr
where id<=len(@s+'a')
and charindex(@split,@split+@s,id)=id)
goif exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[f_splitstr]') and xtype in (n'fn', n'if', n'tf'))
drop function [dbo].[f_splitstr]
go--3.2.5 將資料項按數字與非數字再次拆份
create function f_splitstr(
@s varchar(8000), --待分拆的字串
@split varchar(10) --資料分隔符
)returns @re table(no varchar(100),value varchar(20))
asbegin
--建立分拆處理的輔助表(使用者定義函式中只能操作表變數)
declare @t table(id int identity,b bit)
insert @t(b) select top 8000 0 from syscolumns a,syscolumns b
insert @re
select no=reverse(stuff(col,1,patindex('%[^-^.^0-9]%',col+'a')-1,'')),
value=reverse(left(col,patindex('%[^-^.^0-9]%',col+'a')-1))
from(
select col=reverse(substring(@s,id,charindex(@split,@s+@split,id)-id))
from @t
where id<=len(@s+'a')
and charindex(@split,@split+@s,id)=id)a
return
endgo
if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[f_splitstr]') and xtype in (n'fn', n'if', n'tf'))
drop function [dbo].[f_splitstr]
go--3.2.6 分拆簡訊資料
create function f_splitstr(@s varchar(8000))
returns @re table(split varchar(10),value varchar(100))
asbegin
declare @splits table(split varchar(10),splitlen as len(split))
insert @splits(split)
select 'ac' union all
select 'bc' union all
select 'cc' union all
select 'dc'
declare @pos1 int,@pos2 int,@split varchar(10),@splitlen int
select top 1
@pos1=1,@split=split,@splitlen=splitlen
from @splits
where @s like split+'%'
while @pos1>0
begin
select top 1
@pos2=charindex(split,@s,@splitlen+1)
from @splits
where charindex(split,@s,@splitlen+1)>0
order by charindex(split,@s,@splitlen+1)
if @@rowcount=0
begin
insert @re values(@split,stuff(@s,1,@splitlen,''))
return
endelse
begin
insert @re values(@split,substring(@s,@splitlen+1,@pos2-@splitlen-1))
select top 1
@pos1=1,@split=split,@splitlen=splitlen,@s=stuff(@s,1,@pos2-1,'')
from @splits
where stuff(@s,1,@pos2-1,'') like split+'%'
endend
return
endgo
簡訊字串分拆
分拆簡訊中的資料 問題描述 根據自定義資訊字首表 每個資訊字首可以看作是乙個資訊分隔符 進行字串分拆處理的函式,在分拆處理函式中,首先定義了乙個資訊前緣表 splits,表中包含了ac bc cc dc四個資訊字首 實際使用時,可以在函式中新增其他資訊前緣,也可以定義乙個正式表來儲存資訊字首資料,這...
簡訊字串分拆
分拆簡訊中的資料 問題描述 根據自定義資訊字首表 每個資訊字首可以看作是乙個資訊分隔符 進行字串分拆處理的函式,在分拆處理函式中,首先定義了乙個資訊前緣表 splits,表中包含了ac bc cc dc四個資訊字首 實際使用時,可以在函式中新增其他資訊前緣,也可以定義乙個正式表來儲存資訊字首資料,這...
簡訊字串分拆
分拆簡訊中的資料 問題描述 根據自定義資訊字首表 每個資訊字首可以看作是乙個資訊分隔符 進行字串分拆處理的函式,在分拆處理函式中,首先定義了乙個資訊前緣表 splits,表中包含了ac bc cc dc四個資訊字首 實際使用時,可以在函式中新增其他資訊前緣,也可以定義乙個正式表來儲存資訊字首資料,這...