不确定如何解释这个,所以我只是从示例开始。
假设我有一个这样的表,可以包含多行:
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
我希望你能理解我的想法,并能帮助我解决这个问题。
答案 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')