使用SQL Server 2008时,我尝试执行类似于this帖子的操作,该操作涉及将连接字段拆分为单独的部分以用于规范化目的。
链接帖子中解决方案的问题在于它们仅适用于分隔值。
我试图分割的数据类似于:
UserID - ConcatField
1 - ABC
2 - DEF
我希望输出如下:
UserID - ConcatField
1 - A
1 - B
1 - C
2 - D
2 - E
2 - F
是否有一个函数可以在不使用分隔符的情况下拆分这些值?
答案 0 :(得分:1)
Jeff Moden在SQL Server Central上有一篇关于Tally Tables的优秀文章,其中包括一个关于如此分割字符串的部分。下面列出的第二篇文章是使用Tally Table更深入地了解字符串。
http://www.sqlservercentral.com/articles/T-SQL/62867/
http://www.sqlservercentral.com/articles/Tally+Table/70738/
(需要免费订阅)
答案 1 :(得分:0)
查看TSQL中可用的字符串函数:http://msdn.microsoft.com/en-us/library/ms181984.aspx
在表格中加载原始数据后,您可以使用以下功能相对容易地将它们分开:
* CHARINDEX
* SUBSTRING
* LEN
* LEFT& RIGHT
实际的实现当然取决于数据本身,但是在分割记录之后(可能多次处理它们,首先提取C,然后是B,然后从1 - ABC中提取A),你应该好好去
答案 2 :(得分:0)
这是你的意思吗?
WITH X AS
(
SELECT 1 AS UserID,'ABC' AS ConcatField UNION ALL
SELECT 2 AS UserID,'DEF' AS ConcatField
), N AS
(SELECT 1 i
UNION ALL
SELECT i+1
FROM N
WHERE i<1000 /*Or whatever your max string length is*/
)
SELECT UserID,SUBSTRING(ConcatField,i,1) as ConcatField
INTO #NewTemporaryTable
FROM X JOIN N ON I<= LEN(ConcatField)
OPTION(MAXRECURSION 0)
给出
UserID ConcatField
----------- -----------
1 A
1 B
1 C
2 D
2 E
2 F
编辑尽管正如Jeff Moden在评论中指出的那样,递归CTE的表现远非如此,因此您最好使用其中一种技术创建永久数字表{{3}然后使用
SELECT UserID ,
SUBSTRING(ConcatField, i, 1) AS ConcatField
INTO #NewTemporaryTable
FROM YourTable
JOIN Numbers ON Number <= LEN(ConcatField)