更新查询?或其他解决方案?

时间:2010-04-15 13:22:49

标签: sql-server-2008

我的电子邮件列中包含无效地址,例如“XXX @ hotmail.co.uk,XXX @ hotmail.co.uk”。 (它包括引号)

我的select语句清除了这些:

SELECT SUBSTRING([Email], 2, PATINDEX(‘%,%’, [Email] – 2))
FROM table
WHERE [Email] LIKE ‘”%”’

这可以工作并显示:xxx@hotmail.co.uk

我遇到的问题是,我有大量错误格式的记录,我需要使用上面的SELECT查询结果更新它们。有什么想法吗?

5 个答案:

答案 0 :(得分:2)

UPDATE table SET 
    [Email] = SUBSTRING([Email], 2, PATINDEX(‘%,%’, [Email] – 2)) 
WHERE 
    [Email] LIKE ‘”%”’

答案 1 :(得分:2)

确保您不会丢失任何有效的电子邮件,只需保存更改后的电子邮件:

CREATE TABLE ChangedEmails
(
PK ...
Email ...
)

然后修复电子邮件并保存更改的电子邮件(在一个声明中)

UPDATE YourTable
    SET Email=SUBSTRING([Email], 2, PATINDEX(‘%,%’, [Email] – 2)) 
    OUTPUT INSERTED.PK,DELETED.Email
        INTO ChangedEmails
WHERE 
    Email LIKE ‘”%”’

现在如果有任何疑问,您可以在更改之前看到之前的电子邮件。

另外,根据OP的评论:

  

这是我提出的,但我得到了   一个PK违规密钥,所以我想我需要   找到导致这种情况的行。   谢谢!

不要让PK成为电子邮件地址!! 使用身份作为PK并使电子邮件成为数据列。用它来“修复”你的桌子:

ALTER TABLE YourTable ADD YourPKID int NOT NULL IDENTITY (1, 1)
GO

ALTER TABLE YourTable DROP CONSTRAINT PK_YourTable
GO

ALTER TABLE dbo.JobApps ADD CONSTRAINT
    PK_YourTable PRIMARY KEY CLUSTERED 
    (
    YourPKID 
    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

答案 2 :(得分:1)

UPDATE table
SET Email = SUBSTRING([Email], 2, PATINDEX(‘%,%’, [Email] – 2))
WHERE [Email] LIKE ‘”%”’

应该做的伎俩。当然,首先在测试数据上进行测试:)

答案 3 :(得分:1)

您可以使用UPDATE语句,如下所示:

update table 
set Email = SUBSTRING(Email, 2, PATINDEX('%,%', Email – 2)) 
WHERE Email LIKE '"%"'

答案 4 :(得分:1)

UPDATE table
SET [Email] = SUBSTRING([Email], 2, PATINDEX(‘%,%’, [Email] – 2))
WHERE [Email] LIKE ‘”%”’

请事先确定这个表达式匹配这些有问题的电子邮件地址,并且您不会选择其他具有不同值的行。