技术开发 频道

SQL 2005溢用之:分拆列值

   【IT168技术文档】

   有表tb,如下:

id values
1 aa,bb
 aaa,bbb,ccc
   欲按,分拆values列,分拆后结果如下:
id value
1 aa
1 bb
2 aaa
2 bbb
2 ccc
   之前的老办法,一般是使用临时表

SELECT TOP 8000 id = IDENTITY(int11) 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 #

   在SQL2005中,借用xml,可以简单地一句来实现这个功能

   示例数据

DECLARE @t TABLE(id int, [values] varchar(100)) INSERT @t SELECT 1'aa,bb' UNION ALL SELECT 2'aaa,bbb,ccc'

   查询处理

SELECT A.id,B.value FROM( SELECT id,[values] = CONVERT(xml, '<root><v>' + REPLACE([values],'''</v><v>') + '</v></root>') FROM @t )A OUTER APPLY( SELECT value = N.v.value('.''varchar(100)') FROM A.[values].nodes('/root/v') N(v) )B

   结果:

id  value
1 aa
1  bb
2 aaa
2 bbb
2 ccc

  (5 行受影响)

0
相关文章