日期:2014-05-18  浏览次数:20609 次

请教如何将字符串分割保存为多条记录 和将结果集转换为字符串返回
有数据表 T1,其中有字段 c1 和 u1

假设表中原来有数据为  

c1 u1
1 2
1 3
2 2
1 5

第一个问题:检索,如果检索c1 = 1 的那么得到

c1 u1
1 2
1 3
1 5

但希望返回的结果不是这种结果集,而是由 u1 的值组成的中间用逗号分割的字符串,结果返回为:“2,3,5”



第二个问题是:插入新数据集

通过传入 u1 对应的字符串和某个 c1 的值同时插入多条,且能够避免重复

比如传入参数 c1 = 1 ,u1对应的字符串为 “2,3,7,9”

那么时间插入数据位两条:


c1 u1
1 7
1 9

因为数据
c1 u1
1 2
1 3

表中原来已经存在,不能重复添加

希望用动态sql 语句,不用存储过程和方法

谢谢


本帖将和 
http://topic.csdn.net/u/20111228/21/f518561d-26ac-46e3-9a8a-df35488e9985.html?seed=85076579&r=77110821#r_77110821

合并结贴


------解决方案--------------------
SQL code

create table t1(c1 int, u1 int)

insert into t1
select 1, 2 union all
select 1, 3 union all
select 2, 2 union all
select 1, 5


-- 第一个问题:检索
select t.c1,
left(
cast((select cast(u1 as varchar(1))+',' from t1 where c1=t.c1 for xml path('')) as varchar(10)),
len(cast((select cast(u1 as varchar(1))+',' from t1 where c1=t.c1 for xml path('')) as varchar(10)))-1) u1
from t1 t
where t.c1=1
group by t.c1

c1          u1
----------- ----------
1           2,3,5

(1 row(s) affected)


-- 第二个问题是:插入新数据集
declare @c int,@u varchar(10)

-- 传入的参数
select @c=1,@u='2,3,7,9'

insert into t1
select t2.* 
from 
(select a.c0,
substring(a.u0,b.number,charindex(',',a.u0+',',b.number)-b.number) u0
from (select @c c0,@u u0) a
inner join master.dbo.spt_values b
on b.[type]='p'
and substring(','+a.u0,b.number,1) = ',') t2
left join t1 on t2.c0=t1.c1 and t2.u0=t1.u1
where t1.u1 is null 

select * from t1 where c1=1

c1          u1
----------- -----------
1           2
1           3
1           5
1           7
1           9

(5 row(s) affected)