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

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

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

转载于:https://blog.51cto.com/4721988/1773246

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

  1. 举个栗子!Tableau 技巧(139):突出显示文本表的行或列

    之前,我们分享过 添加操作和控制集高亮数据 的方法.有广州用户反馈:我们公司的数据量不是很大,分析呈现也比较简单,经常用文本表(如下图).但是,向领导汇报时,总感觉不太方便. 如果可以突出显示文本表中 ...

  2. bootstarp js设置列隐藏_隐藏工作表的行、列(第一种简单,第二种很坑,第三种最坑)...

    各位朋友,你们好. 今天和你们分享怎样将工作表的行.列进行隐藏.我将分享两种方法: 一.直接隐藏 通过选中行.列或者单元格,对行列进行隐藏效果见下图: 隐藏行,可以使用:右键菜单.Ctrl+9.开始选 ...

  3. hive表级权限控制_数据库权限管理:表、行、列级别的权限控制

    权限规则 1. 在配有主从集群时建议在主节点上做权限相关操作 2. 只有管理员和超级管理员才有将数据导入至表中的权限 3. 管理员用户赋予的是以整表为单位的权限,所有能赋予的权限为create/sel ...

  4. mysql行转列sql函数_sql动态行转列的两种方法

    第一种方法: 代码如下: select *from ( select Url,case  when  Month=01 then  '1月' when  Month=02 then '2月' when ...

  5. SparkSQL读取hive中的数据,行转列的两种方式【行转列专用函数,UDAF】

    先给数据: vi employees 1,George,nan 2,honey,nv 3,georgedage,nan 4,kangkang,nv 上传数据: hdfs dfs -mkdir /sec ...

  6. Oracle之行转列pivot函数

    文章目录 方法一: Oracle行转列pivot函数 方法二:使用MAX DECODE 实现 方法一: Oracle行转列pivot函数 语法:pivot(任一聚合函数 for 需要转列的值所在列名 ...

  7. 列注释_【EXCEL检查问题】:如何快速检查并删除EXCEL中隐藏的工作表、行、列等信息...

    前注:本案例是以EXCEL2016为示范软件,各版本的部分功能和路径可能不同 在EXCEL使用过程中,你是否遇到过某一列的公式怎么修改都报错的情况?你是否遇到过一个只有区区几行数据的表格,却占用了好几 ...

  8. oracle 按旬统计并且每月小计 行转列 PIVOT函数 与分组小计 ROLLUP 函数

    数据库版本:oralce  11g 表名WM_TD_WATER_DAILY 结构如下,我把没用到的字段隐藏了,全放出来不太好哈. MONITOR_ID为BI_TB_MONITOR_BI的ID ,用于关 ...

  9. oracel 行转列 unpivot函数

    语法 unpivot函数:行转列 语法:unpivot(值所在列的名称 for 字段的名称 in (id,name)): 可能这里有点不明白 例子 学生表:id name age,phone 字段 我 ...

最新文章

  1. C++ vector容器
  2. 什么是 Python 的 「内存管理机制」?
  3. 我为什么最终放弃了 Linux 桌面版的研发
  4. How to POST JSON data with Curl from Terminal/Commandline to Test Spring REST?
  5. JS魔法堂:不完全国际化本地化手册 之 拓展篇
  6. bzoj 1010: [HNOI2008]玩具装箱toy 2011-12-27
  7. (转)刘汝佳书上出现的一些题目
  8. python数字转对应中文_python中将阿拉伯数字转换成中文的实现代码 | 学步园
  9. python中函数的使用_python中的函数的使用示例
  10. MySQL和PGSQL事务锁等待超时时间
  11. 基于oracle设计与实现,基于Oracle的高校研究生招生系统设计与实现.doc
  12. nessuss中文使用手册
  13. 【文章】人的好运从哪里来?
  14. win32 destroywindow函数
  15. android 1到100000 正则,day13 Java学习(常见对象正则表达式)
  16. Open Inventor学习资源
  17. 插入安装光盘并重新启动计算机,电脑开机时显示 插入windows安装光盘并重新启动计算机 怎么解决 急救...
  18. 全力冲unreal了
  19. Vue无缝滚动轮播插件vue-seamless-scroll
  20. window7激活攻略

热门文章

  1. 对话AI大师Bengio:AI不应变成军备竞赛
  2. 干货丨吴恩达深度学习课程的思维导图总结
  3. MIT发布白皮书:美国欲重返世界半导体霸主!
  4. 国内整车厂“造芯”还缺什么?
  5. 2021年值得关注的人工智能与机器学习的五大趋势
  6. 价值2950亿美元的「量子霸权」,技术水平到了哪个阶段
  7. 周鸿祎:quot;安全大脑quot;将成智能经济时代的网络安全中枢
  8. Google提出新型学习范式「Deep Memory」,或将彻底改变机器学习领域
  9. 计算机产业深度报告:云计算与人工智能开启新一轮技术变革周期
  10. 将 iPhone 定位设置在法国,手机速度就能迅速提升?