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() ,
@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 把表中字段存储的逗号隔开内容转换成列表形式
我们日常开发中,不管是表设计问题抑或是其他什么原因,或多或少都会遇到一张表中有一个字段存储的内容是用逗号隔开的列表. 具体效果如下图: ------> 从左边图转换成右边图,像这种需求,我们难免 ...
- SQL将表中某一类型的一列拼接成一行
SELECT TypeName ,(SELECT ','+ UserName FROM [ContainerMembers] t WHERE TypeName= aa.TypeName FOR XML ...
- [原创]SQL 把表中某一个列按照逗号拼接成一行
在我们开发的过程中,难免遇到一种场景,把某个表中的的某个列的值拼接成用逗号隔开的一行数据 如图:我们把UserId列拼接成一行数据 -------> 为此我写了一个存储过程来解决此类问题. -- ...
- sql一个表中两个字段合并求和
sql一个表中两个字段,合并求和 SELECT SUM(字段a+'.'+字段b) as total from TABLE
- SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int
--SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int --关键说明:--1.从系统表syscolumns中的查询所有xtype='48'的记录得到类型为[tinyint]的字段- ...
- 批量替换数据库中所有用户数据表中字段数据类型为char和varchar到nvarchar的脚本
解决问题:字段类型为char的总是占用指定字节长度(末尾好多空白符号),varchar数据类型长度一个汉字占2个字节,内容存储为中文的字段个人建议全部使用nvarchar. 操作说明:打开SQL Se ...
- 在一个SQL Server表中的多个列找出最大值
在一个SQL Server表中一行的多个列找出最大值 有时候我们需要从多个相同的列里(这些列的数据类型相同)找出最大的那个值,并显示 这里给出一个例子 IF (OBJECT_ID('tempdb..# ...
- SQL server 表中如何创建索引?
SQL server 表中如何创建索引?看个示例,你就会了 use master goif db_id(N'zhangxu')is not nulldrop database zhangxugocre ...
- 关于数据库优化1——关于count(1),count(*),和count(列名)的区别,和关于表中字段顺序的问题
1.关于count(1),count(*),和count(列名)的区别 相信大家总是在工作中,或者是学习中对于count()的到底怎么用更快.一直有很大的疑问,有的人说count(*)更快,也有的人说 ...
随机推荐
- java提高篇(二)-----理解java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- SICP-2锻炼.34
[锻炼2.34] 为x给定值,找到一个多项式x的值,它也可以被形式化为累积. 下多项式的值: an*x^n + an-1*x^n-1 + .... + a1*x + a0 採用著名的Horner规则, ...
- POJ 1176 Party Lamps (DFS)
对于一束灯光.提供四种改变彩灯状态(ON<=>OFF)的操作:a.改变全部彩灯状态:b.改变奇数彩灯状态.c.改变偶数彩灯状态:d.改变3k+1号彩灯状态(1,4,7,10...). 给定 ...
- CSS3制作精美的iphone电话图标,不使用图片
<!DOCTYPE HTML> <html lang=zh-cn> <head> <meta charset=utf-8> <title>C ...
- webstorm创建nodejs + express + jade 的web 项目
webstorm创建nodejs + express + jade 的web 项目 前简单了解过nodejs,觉得用nodejs来做个网站也太麻烦了,要自己拼html的字符串返回,这能做网站嘛? 最近 ...
- POJ3061 Subsequence(二进制前缀和法律+仿真足)
二分法+前缀和法律 满足子序列长度的条件(0,n)之间,sum[x+i]-sum[i]从i元素开始序列长度x和.前缀和可在O(n)的时间内统计 sum[i]的值.再用二分找出满足条件的最小的子序列长度 ...
- SQL Server 连接问题-TCP/IP
原文:SQL Server 连接问题-TCP/IP 出自:http://blogs.msdn.com/b/apgcdsd/archive/2012/02/24/ms-sql-server-tcp-ip ...
- 移动端 new CustomEvent('input') 兼容问题
最近在 安卓自带浏览器 上发现 new CustomEvent('input') 不兼容 解决办法 (function () { if(!!window.CustomEvent) return; f ...
- secureCRT使用退格键(backspace)出现^H解决的方法
刚新装了python-3.4.1,使用secureCRT连接上去,可是我在进入后,输入回格键时,屏幕显示的是^H,这个让人受不了.最终在网上找到了解决的方法,仅仅要改动一下secureCRT的配置就可 ...
- SQL Server 优化存储过程的七种方法
原文:SQL Server 优化存储过程的七种方法 优化存储过程有很多种方法,下面介绍最常用的7种. 1.使用SET NOCOUNT ON选项 我们使用SELECT语句时,除了返回对应的结果集外,还会 ...