1

SQL Server 一時テーブルで簡単な更新を行っています。3 つの別々のステートメントで 1 つの列を更新すると、一貫性のない結果が得られますが、1 つの SQL ステートメント内で同じ列を更新すると、期待どおりの結果が得られます。誰かが2つの違いを指摘してください。何か不足していますか?

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

何か案は?

4

1 に答える 1

3

更新により、NewEmailの値に基づいてすべての行の の値が設定されOldEmailます。3 番目の更新は、前の 2 つの更新を上書きします。

したがって、最初の 2 つは無意味です。ただ走るのと同じ

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

そして、それは1行だけを変更します。

個別のステートメントを機能させるには、使用できます

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')
于 2013-10-03T12:22:59.923 に答える