你这个不属于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