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

 

时间: 2024-12-31 02:42:22

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

sql查询语句中字段和要查询的内容都为变量的参数化写法

问题描述 DimcnAsNewSqlClient.SqlConnection(cnStr)DimsqlAsString="Select*From员工信息where"&PnodeText&"=@Node"Dimcmd=NewSqlClient.SqlCommand(sql,cn)DimdaAsNewSqlClient.SqlDataAdapter(cmd)'定义sqldataadapter并于sqlcommand连接Dimds=NewDataSet()

SQL语句实现表中字段的组合累加排序

有表如下: id in out index 1 10 12 2 2 9 8 2 3 12 8 3 1 9 9 3 1 12 0 3 2 5 18 2 2 20 0 2 这三个字段均为integer类型 现要求如下: 1.按index=2查找 2.将所有id相同的和在一起,数据要加在一起 3.最后呈现的数据要按in+out进行排序,按由大到小 为满足以上的要求:设计的SQL语句如下(假设表名为tab) 复制代码 代码如下:select id,sum(in) as in,sum(out) as ou

c#实现批量插入数据到sql数据库表中,怎么做到跳过插入失败的数据,继续插入

问题描述 c#实现批量插入数据到sql数据库表中,怎么做到跳过插入失败的数据,继续插入 c#实现批量插入数据到sql数据库表中,怎么做到跳过插入失败的数据,继续插入. 并且报错,哪几天数据失败了.和失败的原因. 我现在是可以生成一个把一个数据库表的数据导入到另一个数据库表中.但是呢,有些数据由于某个字段过长无法导入成功,而导致所有的都无法导入.直接造成导入失败.我 想过滤掉那条不成功的继续导入.不至于都导入不成功.急! 想和好久也没解决.网上也没找到说法 解决方案 数据库表插入数据失败数据库批量

mysql update 根据表中字段查询另一张表更新更新

问题描述 mysql update 根据表中字段查询另一张表更新更新 mysql有两张表, 班级表class,包含 | id | name | | 1 | 一班 | | 2 | 二班 | 学生表student,其中classId为空,className有值并对应class表中的name | id | name | classId | className | | 1 | 一班 | | 一班 | | 2 | 二班 | | 二班 | | 3 | 一班 | | 一班 | | 4 | 二班 | | 二班

sql查询-sql 同一个表中如何把两条数据合并成一条显示,并显示两条数据的全部内容

问题描述 sql 同一个表中如何把两条数据合并成一条显示,并显示两条数据的全部内容 数据库是 sqlserver2008的环境. 是一个列变行的问题 ,请大师帮忙啊. 比如 table表中 字段: id name bianhao address shijian 1 张三 001 北京 2013-12-1 2 李四 001 北京 2013-12-1 最后显示的内容为: 字段: name1 name2 bianhao address shijian 张三 李四 001 北京 2013-12-1 合并

修改MySQL数据库中表和表中字段的编码方式的方法_Mysql

今天向MySQL数据库中的一张表添加含有中文的数据,可是老是出异常,检查程序并没有发现错误,无奈呀,后来重新检查这张表发现表的编码方式为latin1并且原想可以插入中文的字段的编码方式也是latin1,然后再次仔细观察控制台输出的异常,进一步确定是表和表中字段编码不当造成的,那就修改表和其中对应的字段呗,网上找了一会儿,你别说还真有,执行完sql脚本后果然可以存入中文了,尽管如此还是认为有必要总结一下,古人云:好记性不如烂笔头嘛,呵呵呵. 修改表的编码方式:ALTER TABLE `test`

SQL Server表中添加新列并添加描述_MsSql

注: sql server 2005 及以上支持. 版本估计是不支持(工作环境2005,2008). 工作需要, 需要向SQL Server 现有表中添加新列并添加描述. 从而有个如下存储过程. (先附上存储过程然后解释) /********调用方法********** 作用: 添加列并添加列描述信息 调用: exec [SetColumnInfo] '表名', '列名', N'列说明,描述','列类型{默认:NVARCHAR(50)}','列默认值{默认:NULL}' ************

SQL Server表中添加新列并添加描述

注: sql server 2005 及以上支持. 版本估计是不支持(工作环境2005,2008). 工作需要, 需要向SQL Server 现有表中添加新列并添加描述. 从而有个如下存储过程. (先附上存储过程然后解释) /********调用方法********** 作用: 添加列并添加列描述信息 调用: exec [SetColumnInfo] '表名', '列名', N'列说明,描述','列类型{默认:NVARCHAR(50)}','列默认值{默认:NULL}' ************

2005-如何在SQL数据表中如何剔除连续重复的记录,统计个数时只记做1条记录?

问题描述 如何在SQL数据表中如何剔除连续重复的记录,统计个数时只记做1条记录? 各位大虾帮帮忙:如何剔除数据表中连续重复的记录记做1条记录?? 数据表如下,我想要取result=0的sn在各prodorderid下的个数( 注意:要剔除连续重复的数据,记做1条记录,但是不连续的重复的分别记为1条记录 ) create table test ( id int identity(1,1) primary key, sn varchar(50) not null, prodorderid int n