java split tab分割_将字符串分解成一个表(多行、多列)表值函数[ StrSplit_Tab]

将字符串分解成一个表(多行、多列)表值函数[ StrSplit_Tab]

发布时间:2020-07-21 04:11:43

来源:51CTO

阅读:698

作者:lifox

栏目:数据库

用一个字符串来描述一个表的内容,需要时用这个表值函数将其还原成一个表。

由于无法预知表的列数量和列名,需要使用时进行 【行列转换】。

此函数,也可以像[StrSplit]函数一样,将字符串分解成单列,只要参数@ColumnStr=‘’

当然,也可以将表的列名存储在字符串中,....

下面是SQL代码:

FUNCTION [dbo].[StrSplit_Tab](

@String nvarchar(MAX)--待分割字符串

,@RowStr nvarchar(10)--行分割符

,@ColumnStr nvarchar(10)--列分割符

,@NullItem int=0--是否保留【空元素】[item]的位置编号。不为0保留,为0不保留。

)returns @Tab table(

[Row] int--[Row]:行编号(1,2,3,4,5......)

,[Column]nvarchar(20)--[Column]:列编号(F1,F2,F3.....)

,[item] nvarchar(MAX))--[item]:单元格元素

as

begin

IF ISNULL(@RowStr,'')='' begin--无【行分割符@RowStr】,返回原文

insert into @Tab([Row],[Column],[item]) VALUES (1,'',@String);

RETURN;

end;

SET @NullItem=ISNULL(@NullItem,0);

declare @Ritem nvarchar(MAX);--行文本

declare @begin as int=1,@end as int;--截取文本,起止位置

declare @RL AS int=LEN(@RowStr);--分隔符长度

declare @R AS int=0;--行号

--分解行

set @end=charindex(@RowStr,@String,@begin);

while(@end<>0)

begin

set @Ritem = substring(@String,@begin,@end-@begin);

IF @NullItem<>0 SET @R=@R+1;

IF len(@Ritem)>0 begin

--分解列 --自我调用

IF @NullItem=0 SET @R=@R+1;

insert into @Tab([Row],[Column],[item])

SELECT @R,'F'+CAST([Row] as nvarchar(50)),[item]

FROM [dbo].[StrSplit_Tab](@Ritem,@ColumnStr,'');

end;

set @begin=@end+@RL;

set @end=charindex(@RowStr,@String,@begin);

end

--末尾文本处理

set @Ritem = substring(@String,@begin,len(@String)+1-@begin);

IF len(@Ritem)>0 begin

SET @R=@R+1;

--分解列 --自我调用

insert into @Tab([Row],[Column],[item])

SELECT @R,'F'+CAST([Row] as nvarchar(50)),[item]

FROM [dbo].[StrSplit_Tab](@Ritem,@ColumnStr,'');

end;

return

end

--==============使用范例=====================

select [Row] as 'Row',

max([F1]) as 'F1',

max([F2]) as 'F2',

max([F3]) as 'F3'

from [dbo].[StrSplit_Tab](

';;:小康:342222199506186034;杨蓝:342222197909226046:;向凤:42282519890310110X;;杨玉:510227197510122765;;;'

,';'

,':'

,1)

pivot(

max([item]) for [Column]

in (F1,F2,F3)

)as B

group by [Row]

order by [Row] asc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值