\t\t多对多的数据关系导入数据库的文本串拆分

本文介绍了一个用于处理数据库中包含多对多关系的文本串的自定义函数,通过该函数可以方便地拆分字符串并导入数据库。适用于角色与功能、数据元素等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天刚刚搞定,分享出来大家一起使用!

-- =============================================

-- 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值