2013-02-28 94 views
0

我在尝试将遗留数据转换为新的正确结构化的SQL数据库。为了简单起见,可以说一个旧表包含两个字段,即Id和Emails。这里是一些数据。在SQL中处理&符和特殊字符

ID | Emails 
0 [email protected], [email protected], [email protected] 
1 [email protected] 

我想带他们到新表所示:

INSERT INTO NewTable(Id, [Address]) 
Select t.Id, split.val 
From OldTable t 
Cross Apply dbo.Split(t.Emails, ',') split 
WHERE t.Emails <> '' 

这种运作良好,直到我碰到一个电子邮件:

ID | Emails 
0 [email protected] 
0 [email protected] 
0 [email protected] 
1 [email protected] 

我可以用这个TSQL做到这一点那里有一个特殊的字符就像这样: 电子邮件@汤姆& jerry.com

的符号打破了查询,并引发以下错误:
消息9411,级别16,状态1,行3
XML分析:行1,字符27,分号预计

什么是最简单的方法绕过错误并将电子邮件映射到新表中:email @ tom & jerry.com

谢谢。

+0

请用您正在使用的数据库版本标记您的问题。如果是SQL Server,你使用了什么'dbo.Split'实现? – HABO 2013-02-28 17:02:28

回答

1

您可以直接简单地使用替换替换所有&符号,例如“AANNDD”或“>> AND <'。

SELECT REPLACE(Emails, '&', '>>AND<<')... 

然后,只需在完成后将其替换回来即可。

您可以在插入之前替换旧表格中的所有字节。然后在你的新表上运行更新。

+0

是的。我可以用'&'代替'&',那效果很好。我只是想知道是否有这样的最佳做法。谢谢。 – BBauer42 2013-02-28 16:57:36

+0

有时最简单的方法是最好的。 – Narnian 2013-02-28 16:59:26

+1

@ BBauer42 - 最好的做法是使用更好的“Split”实现。它应该在提供的分隔符上进行拆分,并且可以有选择地处理带引号的字符串。否则,它不应该在普通字符上跳跃。 – HABO 2013-02-28 20:44:53