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

简介: 原文:[原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式  我们日常开发中,不管是表设计问题抑或是其他什么原因,或多或少都会遇到一张表中有一个字段存储的内容是用逗号隔开的列表。   具体效果如下图:   ------》      从左边图转换成右边图,像这种需求,我们难免会遇到。
原文: [原创]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)=''
AS
    BEGIN
        DECLARE @sql VARCHAR(500)
        IF (@Filter<>'')
            BEGIN 
                SET @Sql='
 select '+@ColumnId+', RTRIM( LTRIM( substring('+@ColumnName+'+'','',a.number,charindex('','','+@ColumnName+'+'','',a.number+1)-a.number)) )  Id
                 from master..spt_values a,'+@TableName+' b
                where  '+@Filter+'   and  a.type=''p'' and substring('',''+'+@ColumnName+',a.number,1)='','' '
        
            END
        ELSE
            BEGIN
                SET @Sql='
 select '+@ColumnId+', RTRIM( LTRIM( substring('+@ColumnName+'+'','',a.number,charindex('','','+@ColumnName+'+'','',a.number+1)-a.number)) )  Id
                 from master..spt_values a,'+@TableName+' b
                where    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)
AS
    BEGIN
        DECLARE @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如何将一个列中值内的逗号分割成另一列
本文介绍了在 SQL Server 中如何将一个列中的逗号分隔值拆分成多列。通过使用 `REVERSE` 和 `PARSENAME` 函数组合,实现对地址字符串的拆分,分别提取出街道、城市和州信息。适用于处理类似结构化文本数据的场景,提升数据查询与分析效率。
|
SQL 索引
【YashanDB知识库】字段加上索引后,SQL查询不到结果
【YashanDB知识库】字段加上索引后,SQL查询不到结果
|
SQL 存储 数据库
SQL部分字段编码设置技巧与方法
在SQL数据库管理中,设置字段的编码对于确保数据的正确存储和检索至关重要
1016 9
|
SQL 存储 关系型数据库
SQL判断CHAR类型字段不为空的方法与技巧
在SQL查询中,判断一个CHAR类型字段是否不为空是一个常见的需求
1073 5
|
SQL Oracle 关系型数据库
SQL如何添加字段记录:详细步骤与技巧
在数据库管理中,经常需要向已有的表中添加新的字段(列)或向表中插入新的记录
4080 5
|
SQL 存储 Serverless
SQL语句拆分时间字段的技巧与方法
在数据库操作中,经常需要处理时间数据
2086 1
SQL开发问题之当从数据源读取多个字段时优化 COUNT(DISTINCT ...) 的查询的问题如何解决
SQL开发问题之当从数据源读取多个字段时优化 COUNT(DISTINCT ...) 的查询的问题如何解决
526 7
|
SQL Java Scala
flink-cdc SQL Server op 字段如何获取?
Flink CDC 是 Apache Flink 的组件,用于捕获数据库变更事件。对 SQL Server,通过 Debezium 连接器支持变更数据捕获。`op` 字段标识操作类型(INSERT、UPDATE、DELETE)。配置包括添加依赖及设定 Source 连接器,可通过 Flink SQL 或 Java/Scala 完成。示例查询利用 `op` 字段筛选处理变更事件。
931 1
|
SQL 关系型数据库 MySQL
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
937 0
|
SQL Oracle 关系型数据库
SQL添加字段记录详解:技巧与方法实践
在数据库管理中,经常需要向表中添加新的字段(列)或向现有字段中插入新的记录(行)
3294 0