原文:[原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式

  我们日常开发中,不管是表设计问题抑或是其他什么原因,或多或少都会遇到一张表中有一个字段存储的内容是用逗号隔开的列表。

  具体效果如下图:

  ------》

从左边图转换成右边图,像这种需求,我们难免会遇到。

今天我写了个存储过程来解决这种问题。主要方式是利用master..spt_values表。

具体存储过程如下:

-- Author:        LHM
-- Create date: 2015-01-10
-- Description:    把表中某一个列按照逗号拼接列表
--示例: EXEC [Sp_StringsToTable] 'AgentId','UserId','Bse_GeneralAgent',''
-- =============================================
CREATE   PROCEDURE [dbo].[Sp_StringsToTable]@ColumnId VARCHAR(100) ,@ColumnName VARCHAR(2047) ,@TableName NVARCHAR(100) ,@Filter VARCHAR(1000)=''
ASBEGINDECLARE @sql VARCHAR(500)IF (@Filter<>'')BEGIN SET @Sql='select '+@ColumnId+', RTRIM( LTRIM( substring('+@ColumnName+'+'','',a.number,charindex('','','+@ColumnName+'+'','',a.number+1)-a.number)) )  Idfrom master..spt_values a,'+@TableName+' bwhere  '+@Filter+'   and  a.type=''p'' and substring('',''+'+@ColumnName+',a.number,1)='','' 'ENDELSEBEGINSET @Sql='select '+@ColumnId+', RTRIM( LTRIM( substring('+@ColumnName+'+'','',a.number,charindex('','','+@ColumnName+'+'','',a.number+1)-a.number)) )  Idfrom master..spt_values a,'+@TableName+' bwhere    a.type=''p'' and substring('',''+'+@ColumnName+',a.number,1)='','' 'END    EXEC   (@Sql)END 

这个存储过程有一个限制:就是@ColumnName的值不能超过2047个字节,也就是说,图中的UserId的字段里面的内容不能超过2047个字符。

原因就是因为master..spt_values表的限制。大家可以在数据库中执行 SELECT * FROM  master..spt_values type='p' 就可以知道限制的原因了。

有兴趣的朋友可以 试着建立如图的表

CREATE TABLE [dbo].[Bse_GeneralAgent]([AgentId] [int] IDENTITY(1,1) NOT NULL,[UserId] [varchar](max) NULL,CONSTRAINT [PK_Bse_GeneralAgent] PRIMARY KEY CLUSTERED
([AgentId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]GO

随意添加一些测试数据进行测试 。只需执行存储过程

EXEC [Sp_StringsToTable] 'AgentId','UserId','Bse_GeneralAgent',''

希望给遇到此类需求的朋友带来帮助,谨此记录。

 如果觉得有用,可以推荐一下,谢谢。

------------------------------------------------------------以下是指尖流淌的思路,感谢---------------------------------------------------

-- Author:        LHM
-- Create date: 2015-01-10
-- Description:    把表中某一个列按照逗号拼接列表
--示例: EXEC Sp_StringsToTableExtend 'AgentId','UserId','Bse_GeneralAgent'
-- =============================================
CREATE   PROCEDURE [dbo].Sp_StringsToTableExtend@ColumnId VARCHAR(MAX) ,@ColumnName VARCHAR(MAX) ,@TableName NVARCHAR(100)
ASBEGINDECLARE @sql VARCHAR(500) SET @Sql='SELECT  A.'+@ColumnId+' ,  B.StrColumn
FROM    (SELECT StrXml = CONVERT(XML, ''<root><v>''+REPLACE('+@ColumnName+', '','', ''</v><v>'')+''</v></root>'') ,     '+@ColumnId+'  ,    UserId    FROM   '+@TableName+'   ) A OUTER APPLY (SELECT StrColumn = N.v.value(''.'', ''nvarchar(40)'')  FROM   A.StrXml.nodes(''/root/v'') N (v)   ) B 'EXEC  (@Sql)END
GO

SQL 把表中字段存储的逗号隔开内容转换成列表形式相关推荐

  1. JS 使用正则匹配字符串中所有大括号包含的数据,转换成数组形式

    JS 使用正则匹配字符串中所有大括号包含的数据,转换成数组形式 .match(/{[^}{]*?}/g)

  2. SQL删除表中字段name相同的数据,需要保留一条

    表数据如下: 删除字段IosVersion 相同的数据,保留id最小的一条 方法1:sql如下: 方法2: 采用distinct函数 delete from AppVersion where IosV ...

  3. (SQL)删除表中字段有中文的记录

    --查询 select   *   from   table  where   字段名   like   '%[吖-座]%' --删除(一个表,一个列,逐一来删除.) delete  table wh ...

  4. columnproperty server sql_导出SQL Server数据库表中字段的说明/备注

    时 间:2013-02-18 09:09:11 作 者:摘 要:导出SQL Server数据库表中字段的说明/备注 正 文: 打开SQL企业管理器 ,找到你要导出用户表字段信息的那个数据库 ,点击工具 ...

  5. SQL Server 将一个表中字段的值复制到另一个表的字段中

    原文:SQL Server 将一个表中字段的值复制到另一个表的字段中 具体方法如下 一:update 表2 set (要插入的列名)= select 表1.某一列 from 表1 left jion ...

  6. sql一个表中两个字段合并求和

    sql一个表中两个字段,合并求和 SELECT SUM(字段a+'.'+字段b) as total  from TABLE 转载于:https://www.cnblogs.com/lovewyc131 ...

  7. Oracle数据库表中字段顺序的修改方法

    Oracle数据库表中字段顺序的修改方法 这篇文章主要给大家介绍了关于Oracle数据库表中字段顺序的修改方法,在介绍修改的方法之前先给大家介绍了Oracle数据库表新建字段的方法,文中通过示例代码介 ...

  8. oracle 表字段顺序_Oracle数据库如何修改表中字段顺序

    Oracle数据库如何修改表中字段顺序 发布时间:2020-07-09 15:53:15 来源:亿速云 阅读:166 本篇文章给大家分享的是有关Oracle数据库如何修改表中字段顺序,小编觉得挺实用的 ...

  9. oracle 表字段顺序_如何更改Oracle数据库表中字段顺序

    软件安装:装机软件必备包 SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.在使用它时,只需要发出& ...

最新文章

  1. Apr.2010 Microsoft MVP连任
  2. ipc620中文版最新版本_(一)Windows10 家庭中文版Docker安装 搭建docker开发环境
  3. 写了一阵子多线程之后需要注意的几点
  4. java必知必会_Java必知必会--spring解析基础篇
  5. Xcode6中如何对scrollview进行自动布局(autolayout)
  6. JAVA面试常考系列五
  7. ffmpeg 解码视频(h264、mpeg2)输出yuv420p文件
  8. 题解---2015年浙江理工12月校赛
  9. 2.9 iframe
  10. IIS6.0文件解析漏洞原理/复现
  11. 蓝桥杯 ALGO-112 算法训练 暗恋
  12. 2017的金秋,派卧底去阿里、京东、美团、滴滴带回来的面试题及答案
  13. 非网络打印机/扫描仪无线解决方案
  14. Chrome 谷歌浏览器 google 复制网页上禁止复制的文本
  15. 2022年全球程序员平均薪资发布,中国排名很意外
  16. HDU 2825 AC自动机+状压dp
  17. python基于scrapy框架爬取当当图书信息
  18. android备份手机号码,简单四步 完成Android手机通讯录云备份操作
  19. nn.Sigmoid torch
  20. 计算机格式字体颜色,电脑怎么设置不同的字体颜色样式

热门文章

  1. VTK:直线网格之RGrid
  2. VTK:图片之DrawOnAnImage
  3. OpenCV camshift算法的实例(附完整代码)
  4. OpenCV背景减法Background Subtraction Methods
  5. Qt Creator使用自定义着色器
  6. C语言实现Floyd-Warshall(弗洛伊德算法)(附完整源码)
  7. 「Apollo」Cyber RT 学习笔记
  8. 64.多态性实现机制—静态分派与动态分派(方法解析、静态分派、动态分派、单分派和多分派)
  9. Spring2.5整合JPA
  10. web系统 手机app 能访问吗?_苹果手机能下载什么好用的桌面便签?有什么好的便签app推荐吗...