将字符串分解成一个表(多行、多列)表值函数[ StrSplit_Tab]
admin
2023-06-10 09:03:41
0

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

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

此函数,也可以像[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



相关内容

热门资讯

李在明向山西煤矿爆炸事故遇难者... 据凤凰卫视报道,韩国总统李在明5月24日就中国山西省煤矿爆炸事故造成多人遇难表示,向遇难者家属和中国...
华为正式发表半导体领域新定律 人民日报客户端 华为正式发表半导体领域新定律 晶体管密度与系统性能通过逻辑折叠技术实现新突破 202...
武契奇向人民英雄纪念碑敬献花圈 5月25日上午,塞尔维亚总统武契奇前往天安门广场,向人民英雄纪念碑敬献花圈。
重庆多个景区受强降雨影响临时闭... 澎湃新闻记者 廖艳 实习生 林霄近日,受持续强降雨的影响,重庆多个景区出现水位上涨、多处塌方等情况,...
视频丨随迁子女教育保障、异地参... 昨天(22日),《国务院关于推行常住地提供基本公共服务的实施意见》对外发布。文件明确提出,促进未落户...
打造生态链 创新再加速 本报讯 (记者 翁云骞 通讯员 虞昌胜 高博雯) 研发整体效率提升30%,其中代码编写效率提升50%...
前DeepMind华人研究员离... 新智元报道 【新智元导读】前谷歌DeepMind研究员离职并发表长文指出AI行业当前最被低估的瓶颈...
以人工智能应用场景推进数实深度... (来源:天津日报) 转自:天津日报 “十五五”规划纲要提出“全面实施‘人工智能+’行动”,并对构建高...
3名青少年强奸犯免于监禁引众怒... 【文/观察者网 陈思佳】“三名青少年强奸犯免于监禁,引发英国全国争议。”据《国际商业时报》5月24日...
河南省“十五五”规划纲要全文发... 【大河财立方消息】5月25日,河南省国民经济和社会发展第十五个五年规划纲要全文发布。其中提到,提振汽...