wudi

博客园 首页 新随笔 联系 订阅 管理

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

 

posted on 2010-08-19 13:06  菜鸟吴迪  阅读(416)  评论(0编辑  收藏  举报