【问题标题】:SQL Server Update column results in inconsistent resultSQL Server 更新列导致结果不一致
【发布时间】:2013-10-03 12:18:26
【问题描述】:

我正在对 SQL Server 临时表进行简单更新。当我用三个单独的语句更新单个列时,我得到一个不一致的结果,但是当我在一个 SQL 语句中更新同一列时,我得到了预期的期望。请有人指出两者之间的区别。我错过了什么吗?

这里是 SQL:

CREATE TABLE #EmailChanges 
(
    OldEmail varchar(100),
    NewEmail varchar(100)
)

INSERT INTO #EmailChanges(OldEmail)
VALUES
('no.body@ccc.abc.com'),
('foo.bar@abc.com'), 
('any.body@xyz.com')

UPDATE #EmailChanges SET NewEmail = replace(OldEmail, '@ccc.abc.com', '@new.domain.com')
UPDATE #EmailChanges SET NewEmail = replace(OldEmail, '@xyz.com', '@new.domain.com')
UPDATE #EmailChanges SET NewEmail = replace(OldEmail, '@abc.com', '@new.domain.com')

-- If I uncomment below sql and comment above three updates, I get desired output.
-- UPDATE #EmailChanges SET NewEmail = replace(replace(replace(OldEmail, '@ccc.abc.com', '@new.domain.com'), '@xyz.com', '@new.domain.com'), '@abc.com', '@new.domain.com')

SELECT * FROM #EmailChanges

这给了我以下结果:

OldEmail              NewEmail
--------------------- --------------------------
no.body@ccc.abc.com   no.body@ccc.abc.com
foo.bar@abc.com   foo.bar@new.domain.com
any.body@xyz.com      any.body@xyz.com

有什么想法吗?

【问题讨论】:

    标签: sql sql-server-2008 replace sql-update temp-tables


    【解决方案1】:

    您的更新根据OldEmail 中的值在所有行中设置NewEmail 的值。第三次更新会覆盖前两次更新。

    所以前两个是没有意义的。和刚才跑一样

    UPDATE #EmailChanges SET NewEmail = replace(OldEmail, '@abc.com', '@new.domain.com')
    

    这只会改变一行。

    你可以使用单独的语句来工作

    UPDATE #EmailChanges SET NewEmail = replace(OldEmail, '@ccc.abc.com', '@new.domain.com')
    UPDATE #EmailChanges SET NewEmail = replace(NewEmail, '@xyz.com', '@new.domain.com')
    UPDATE #EmailChanges SET NewEmail = replace(NewEmail, '@abc.com', '@new.domain.com')
    

    【讨论】:

    • 谢谢马丁!傻我! :(
    猜你喜欢
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多