T-SQL过程拆分和连接子列

时间:2014-11-24 15:07:27

标签: sql sql-server tsql

不确定如何解释这个,所以我只是从示例开始。

假设我有一个这样的表,可以包含多行:

id  Type    Text
1   Test    Failure A=123 B=444 C=43343 Error=4 ErroDes=1

我还有一个静态错误和ErrorDes表,看起来像这样

Id  Code    Description
1   1       Error1
2   4       Error4

如何将列中的信息拆分为单独的字段,并加入子表中的信息。

预期结果将是这样的:

Type    Field1    FieldA    FieldB  FieldC  Error   ErrorDes
Test    Failure   123       444     43343   Error4  Error1

我使用相同的表来加入示例,但这是db中的2个表。

所以为了解决这个问题,我在数据库中有一个split函数。

如果我首先将文本字段拆分为“空格”然后再打开“=”,我会得到我需要的所有内容(或至少在单独行中的所有列)

cross apply dbo.Split(a.Text, ' ') s
cross apply dbo.Split(s.Value, '=') s2

我从split函数返回“TokenID”和“Value”字段。 它的输出如下所示:

TokenID   Value         TokenID   Value
  1       Failure          1      Failure     
  2       A=123            1      A
  2       A=123            2      123
  3       B=444            1      B
  3       B=444            2      444
  4       C=43343          1      C
  4       C=43343          2      43343          
  5       Error=4          1      Error
  5       Error=4          2      4
  6       ErrorDes=1       1      ErrorDes
  6       ErrorDes=1       2      1

我希望你能理解我的想法,并能帮助我解决这个问题。

1 个答案:

答案 0 :(得分:1)

您可以使用类似下面的UDF函数来交叉应用

create function udf_ReturnTextSplit(@vText varchar(100))
returns @rt table (
    Field1 varchar(100),
    FieldA varchar(100),
    FieldB varchar(100)
) as begin
    declare @st varchar(100) = @vText + ' '
    declare @sti varchar(100)
    declare @stj varchar(100)
    insert into @rt (Field1, FieldA, FieldB) values (null, null, null)
    declare @i int = charindex(' ', @st)

    while @i > 0 begin        
        set @sti = SUBSTRING(@st, 1, @i)        
        set @st = substring(@st, @i + 1, 100)        

        set @i = CHARINDEX('=', @sti)
        if @i > 0 begin
            set @stj = substring(@sti, @i + 1, 100)
            set @sti = substring(@sti, 1, @i - 1)
            if @sti = 'A' update @rt set FieldA = @stj                
            if @sti = 'B' update @rt set FieldB = @stj                
        end else begin
            update @rt set Field1 = @sti
        end

        set @i = charindex(' ', @st)
    end    

    return
end
go

select * from dbo.udf_ReturnTextSplit('Failure A=123 B=444 C=43343 Error=4 ErroDes=1')