今天刚刚搞定,分享出来大家一起使用!
-- =============================================
-- Author: David.Yan
-- Create date: 05/27/2010
-- Description: 拆分字符串,但参数不能为空或空字符串
-- 适用于多对多的数据关系导入数据库的文本串执行
-- select * from dbo.ufn_SplitTable('Role1|Func1_Func2,Role2|Func1_Func2,',default,default,default)
-- select * from dbo.ufn_SplitTable('数据元素分隔符(2) 数据元素分隔符(3) 数据元素【分隔符(1)】,',default,default,default)
-- =============================================
Create FUNCTION [dbo].[ufn_SplitTable]
(
@SourceSql varchar(max)--max很重要,否则大数据来了就要“截”,以下max同理
,@StrSeprate1 varchar(10)=','
,@StrSeprate2 varchar(10)='|'
,@StrSeprate3 varchar(10)='_'
)
returns @temp table( [ID] int IDENTITY (1,1),[K] varchar(50),[V] varchar(100))
as
begin
IF(@StrSeprate1='') return;
DECLARE @i int
SET @SourceSql=rtrim(ltrim(@SourceSql))
SET @i=charindex(@StrSeprate1,@SourceSql)--第一个标记出现的位置
DECLARE @IsGo bit --循环开关
SET @IsGo=1
WHILE @IsGo=1
BEGIN
DECLARE @j int --第二个标记出现的位置
DECLARE @Rel varchar(max)
IF @i>=1
BEGIN
SET @Rel=left(@SourceSql,@i-1)
END
ELSE
BEGIN
SET @Rel=@SourceSql
END
SET @j=charindex(@StrSeprate2,@Rel)
IF @j>=1
BEGIN
DECLARE @key varchar(50)
DECLARE @values varchar(max)
SET @key=left(@Rel,@j-1)
SET @values=Right(@Rel,len(@Rel)-@j+1-len(@StrSeprate2))
DECLARE @k int --第三个标记出现的位置
set @k=charindex(@StrSeprate3,@values)
WHILE @k>=1
BEGIN
INSERT @temp values(@key,left(@values,@k-1))
SET @values=Right(@values,len(@values)-@k+1-len(@StrSeprate3))
SET @k=charindex(@StrSeprate3,@values)
END
if @values<>''
INSERT @temp values(@key,@values)
END
ELSE
BEGIN
if @Rel<>''
INSERT @temp values('',@Rel)
END
IF @i>=1
BEGIN
SET @SourceSql=Right(@SourceSql,len(@SourceSql)-@i+1-len(@StrSeprate1))
SET @i=charindex(@StrSeprate1,@SourceSql)
END
ELSE
BEGIN
SET @IsGo=0
END
END
return
end