MSSQL将逗号分隔的字符串转换成列显示

你这个不属于SSIS的范畴,可以说是TSQL范畴.
这种东西不适合用SSIS来做,每样工具都有自己的优势,如果运用好它们让它们做自己擅长的事才是你应该学习的。
这里的话你可以这样解,思路如下:

1. 为了能将 aaa,bbb 拆分开,你可以通过 CROSS JOIN的方式来实现。
2. 为了能够CROSS JOIN你必须要创建几行虚拟行,利用 SQL系统表来创建虚拟行
3. 虚拟行创建完毕后,利用CROSS JOIN的方式达到根据 有几个 “,”号来拆几行
4. 完成后就会出现重复的行,也就是说 如果你是 "aa,bb,cc" 这样的情况,那么就有3行数据并且它们的数据一模一样
5. 使用SUBSTRING 和 CHARINDEX 来根据ID号 来选择要第几个逗号后面的字符
6. 最终完成

以下是完整TSQL: 可以直接Ctrl+C Ctrl+V 到你的SSMS里执行
IF OBJECT_ID('Test1') IS NOT NULL DROP TABLE Test1
GO
CREATE TABLE Test1(ID varchar(3), [Value] varchar(8))
INSERT INTO Test1(ID, [Value])
SELECT 1, 'aa,bb'
UNION ALL
SELECT 2, 'cc,dd,ee'
GO

SELECT ID, SUBSTRING([Value], b.number, CHARINDEX(',', [Value] + ',', b.number)-b.number) AS [Value]
FROM Test1 a, master..spt_values b
WHERE
    b.number >= 1 AND b.number < LEN(a.[Value]) AND b.type='P' AND SUBSTRING(',' + [Value] ,number,1) = ','



原表
1 aa,bb
2 cc,dd,ee

现在
1 aa
1 bb
2 cc
2 dd
2 ee

 

 
  
表A
xm xk
张三 语文,历史,音乐
李四 体育,语文

现在想查询得到
xm xk
张三 语文
张三 历史
张三 音乐
李四 体育
李四 语文


1
Select 2 a.xm,xk=substring(a.xk,b.number,charindex(',',a.xk+',',b.number)-b.number) 3 from 4 表A a join master..spt_values b 5 ON b.type='p' AND b.number BETWEEN 1 AND LEN(a.xk) 6 where 7 substring(','+a.xk,b.number,1)=','

--1.将字符串转换为列显示 
if object_id('tb') is not null drop table tb 
go 
create table tb([编号] varchar(3),[产品] varchar(2),[数量] int,[单价] int,[金额] int,[序列号] varchar(8)) 
insert into tb([编号],[产品],[数量],[单价],[金额],[序列号]) 
select '001','AA',3,5,15,'12,13,14' union all
select '002','BB',8,9,13,'22,23,24'
go 
select [编号],[产品],[数量],[单价],[金额] 
,substring([序列号],b.number,charindex(',',[序列号]+',',b.number)-b.number) as [序列号] 
from tb a with(nolock),master..spt_values b with(nolock) 
where b.number>=1 and b.number<=len(a.[序列号]) and b.type='P'
and substring(','+[序列号],number,1)=','
go 
drop table tb 
go 
/** 
编号   产品   数量          单价          金额          序列号 
---- ---- ----------- ----------- ----------- -------- 
001  AA   3           5           15          12 
001  AA   3           5           15          13 
001  AA   3           5           15          14 
002  BB   8           9           13          22 
002  BB   8           9           13          23 
002  BB   8           9           13          24 
*/ 
---------- 

 

--7.将字符串显示为行列 
if object_id('tb') is not null 
  drop table tb
create table tb
(
  id int identity(1,1),
  s nvarchar(100)
)
insert into tb(s) select '车位地址1,车位状况1|车位地址2,车位状况2|车位地址n,车位状况n';

with cte as(   select substring(s,number,charindex('|',s+'|',number)-number) as ss     from tb with(nolock),master..spt_values with(nolock)       where type='P' and number>=1 and number<=len(s) and substring('|'+s,number,1)='|' )
select left(ss,charindex(',',ss)-1)as s1,substring(ss,charindex(',',ss)+1,len(ss))as s2 from cte;
drop table tb /** s1 s2 ----------- ------------ 车位地址1 车位状况1 车位地址2 车位状况2 车位地址n 车位状况n

 

你可能感兴趣的:(MSSQL将逗号分隔的字符串转换成列显示)