sql拆分字符串表值函数!!
时间:2010-08-19 来源:菜鸟吴迪
USE [BeisenSuccession]
GO
/****** Object: UserDefinedFunction [dbo].[ufn_Split] Script Date: 08/19/2010 13:09:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
拆分字符串,但参数不能为空或空字符串
使用方法:select * from dbo.ufn_Split('sssss,ss,sssss',default)
*/
ALTER FUNCTION [dbo].[ufn_Split]
(
@SourceSql varchar(8000)
,@StrSeprate1 varchar(10)=','
)
returns @temp table( [ID] int IDENTITY (1,1),[V] varchar(100))
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate1,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=Right(@SourceSql,len(@SourceSql)-@i+1-len(@StrSeprate1))
set @i=charindex(@StrSeprate1,@SourceSql)
end
if @SourceSql<>''
insert @temp values(@SourceSql)
return
end
--------------------------------------------------------
USE [BeisenSuccession]
GO
/****** Object: UserDefinedFunction [dbo].[ufn_SplitTable] Script Date: 08/19/2010 13:08:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- 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)
-- =============================================
ALTER FUNCTION [dbo].[ufn_SplitTable]
(
@SourceSql varchar(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