让我们说我在SQLServer中有一个名为Tasks的表。它包含一些任务,并指派了人员。工人在一列中。它们之间用分号隔开。
ID Workers
1 John Newman; Troy Batchelor; Mike Smith
2 Chris Portman
3 Sara Oldman; Greg House
我需要将工作人员从下面的列中分离出来
结果:
ID Worker
1 John Newman
1 Troy Batchelor
1 Mike Smith
2 Chris Portman
3 Sara Oldman
3 Greg House
我不知道该怎么办。 我必须使用某些过程还是简单的查询就足够了?
答案 0 :(得分:2)
我不使用任何函数或存储过程即可解决您的问题
SELECT ID,Workers FROM tblSemiColon
SELECT ID,
LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) AS Workers
FROM
(
SELECT ID,CAST('<XMLRoot><RowData>' + REPLACE(Workers,';','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
FROM tblSemiColon
)t
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n)
这将适用于所有版本的sql server。.我已经对其进行了测试。...
您可以减小varchar长度的大小。
答案 1 :(得分:0)
如果您使用的是SQL Server 2016或更高版本,则可以使用STRING_SPLIT函数
SELECT id, value
FROM Tasks
CROSS APPLY STRING_SPLIT(Workers, ';')