--调用示例
select * from dbo.fsplit('a;adf;fd;ed;dh',';')
select * from dbo.fsplit('a,,adf,,fd,,ed,,dh',',,')
邹建 2003.07*/
--检查函数是否存在
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[fsplit]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[fsplit]
GO
--创建字符串分拆的函数
create function fsplit(
@str varchar(8000) --要分拆的字符串
,@spli varchar(10) --字符串分隔符
)
returns @re table(istr varchar(8000))
as
begin
declare @i int,@splen int
select @splen=len(@spli)
,@i=charindex(@spli,@str)
while @i>0
begin
insert into @re values(left(@str,@i-1))
select @str=substring(@str,@i+@splen,8000)
,@i=charindex(@spli,@str)
end
if @str<>'' insert into @re values(@str)
return
end
--调用:
select * from dbo.fsplit('aa|bb|cc|dd|','|')
--N要连继,
select top 8000 identity(int,1,1) as N into numtab from
(select top 100 id=1 from sysobjects) as a,
(select top 100 id=1 from sysobjects) as b,
(select top 100 id=1 from sysobjects) as c
---------------------------------------------------------------------
declare @a table (id int,string varchar(8000))
insert @a select 1 ,'a,b,c,sd,dfsdfg'
union select 2, 'a,n,sdf,we,t'
union select 3, 's,df,df'
select a.*,b.*,id,substring(','+string+',',N+1,charindex(',',','+string+',',N+1)-(N+1))
from @a a,numtab b
where substring(','+string+',',N,8000) like ',_%'
order by id,N
DECLARE @str NVARCHAR(200),@SubStr NVARCHAR(50)
SET @str='aa|bb|cc|dd'
WHILE CHARINDEX('|',@str,0)>0
BEGIN
SET @SubStr = LEFT(@str,CHARINDEX('|',@str,0)-1)
SELECT @SubStr
SET @str = RIGHT(@str,Len(@str)-CHARINDEX('|',@str,0))
END
declare @a varchar(20),@b varchar(200)
set @a = 'aa|bb|cc|dd'
set @b = 'select ''' + replace(@a,'|',''' union all select ''') + ''''
print @b
exec (@b)
结果
aa
bb
cc
dd
declare @string varchar(1000)
declare @xh char(10)
declare @sh varchar(13)
set @string='aa|bb|cc|dd|'
set @string='select * into ##tmp from (select '''+replace(@string,'|','''as str union all select ''')+''') a'
exec(@string)
declare @string varchar(1000)
set @string='aa|bb|cc|dd|'
set @string=left(@string,len(@string)-1)
set @string='select * from (select '''+replace(@string,'|','''as str union all select ''')+''') a'
exec(@string)