搜索一下行列装换create table #1 (id int,content nvarchar(256))
insert #1 values(1,'200S,100C,300D ')select a.id,b.dd from (
select id
,content = cast( '<R>'+replace(content,',','</R><R>')+'</R>' as xml) from #1 )a
outer apply
(
select N.V.value('.','varchar(10)') as dd from a.content.nodes('/R') N(V)
)bid dd
----------- ----------
1 200S
1 100C
1 300D (3 row(s) affected)
insert # values(1,'200S,100C,300D ')
declare @a varchar(2000)
select @a ='select id,col= '''+replace(content,',',''' from # union all select id,''')+''''+' from #' from #
exec(@a)
drop table #id col
----------- -----
1 200S
1 100C
1 300D
例:
0842S,0900F,1300F,1800F→拆成三笔
第一笔立即执行0842 ,仅需于当日该时间执行一次
第二笔首日0900 1300 1800
第三笔例行0900 1300 1800
(2)
2100F,0900 (Q12H)→拆成两笔,0900每隔十二小时执行
第一笔首日2100
第二笔 0900 2100
(3)
0700,1100,1600 (TIDAC)→就一笔,每天这三个时间都要执行
(4)
1200F,1800F,0600,0000 (Q6H)→拆成两笔 0600开始每隔六时小执行
第一笔首日 1200 1800
第二笔例行 0000 0600 1200 1800
(5)
0110S (ST)→就一笔于该时间点执行一次,仅需于当日该时间执行一次
1530 →就一笔例行每天执行2100F→两笔
第一笔首日2100
第二笔例行2100
标题:分拆列值
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-11-20
地点:广东深圳
描述有表tb, 如下:
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
欲按id,分拆value列, 分拆后结果如下:
id value
----------- --------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
*/--1. 旧的解决方法(sql server 2000)
SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b SELECT A.id, SUBSTRING(A.[values], B.id, CHARINDEX(',', A.[values] + ',', B.id) - B.id)
FROM tb A, # B
WHERE SUBSTRING(',' + A.[values], B.id, 1) = ','DROP TABLE #--2. 新的解决方法(sql server 2005)
create table tb(id int,value varchar(30))
insert into tb values(1,'aa,bb')
insert into tb values(2,'aaa,bbb,ccc')
go
SELECT A.id, B.value
FROM(
SELECT id, [value] = CONVERT(xml,'<root><v>' + REPLACE([value], ',', '</v><v>') + '</v></root>') FROM tb
)A
OUTER APPLY(
SELECT value = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/root/v') N(v)
)BDROP TABLE tb/*
id value
----------- ------------------------------
1 aa
1 bb
2 aaa
2 bbb
2 ccc(5 行受影响)
*/