问题描述:
有表 tb, 如下 :
有表 tb, 如下 :
id values
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
欲按
,
分拆
values
列
,
分拆后结果如下
:
id value
----------- --------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
1. 旧的解决方法
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. 新的解决方法
--
示例数据
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
行受影响
)
--*/
附
:
合并与分拆的
CLR
,
sql2005
的示例中有:
在安装 sql 2005 的示例后,默认安装目录为 drive:/Program Files/Microsoft SQL Server/90/Samples/Engine/Programmability/CLR/StringUtilities 中
在安装 sql 2005 的示例后,默认安装目录为 drive:/Program Files/Microsoft SQL Server/90/Samples/Engine/Programmability/CLR/StringUtilities 中