将SQL列中的字符串拆分为多行

时间:2015-01-27 15:43:10

标签: sql

我有一个表格,其中包含以逗号分隔的电子邮件地址列表和帐户名称。基本上我的目标是按电子邮件地址分开它们。

所以我的初始表是这样的:

Email                                 Account
abc@test.com, bcd@gmail.com           Company A
hello@yahoo.com, sayonara@gmail.com   Company B

我的目标是制作一个这样的结果表:

Result               Account
abc@test.com         Company A
bcd@gmail.com        Company A
hello@yahoo.com      Company B
sayonara@gmail.com   Company B

所以我从这里开始阅读有关创建分割函数的解决方案: T-SQL: Opposite to string concatenation - how to split string into multiple records

所以这是我的分裂功能:

create FUNCTION [dbo].[SplitAgain] (@sep VARCHAR(32), @s VARCHAR(MAX))
RETURNS TABLE
AS
    RETURN
    (
        SELECT r.value('.','VARCHAR(MAX)') as Item
        FROM (SELECT CONVERT(XML, N'<root><r>' + REPLACE(REPLACE(REPLACE(@s,'& ','&amp; '),'<','&lt;'), @sep, '</r><r>') + '</r></root>') as valxml) x
        CROSS APPLY x.valxml.nodes('//root/r') AS RECORDS(r)
    )

然后我从下面的表中做了一个SELECT,我想这个函数的结果将存储在&#39; Item&#39;列中。

SELECT email_address,Item, account
FROM contact 
CROSS APPLY dbo.SplitAgain(email_address,',')

但是我很困惑,因为结果是这样的......结果&#39;项目&#39;只是逗号。

Email                                 Result    Account
abc@test.com, bcd@gmail.com           ,         Company A
hello@yahoo.com, sayonara@gmail.com   ,         Company B
我确实错过了一些东西。任何帮助表示赞赏!

-icha

1 个答案:

答案 0 :(得分:1)

您的参数顺序已反转

SELECT email_address,Item, account
FROM contact 
CROSS APPLY dbo.SplitAgain(',',email_address)