2009-09-25 89 views
1

嗨,我正在尋找一個解決方案 更新表1中的值只有當值更改。我的意思是比較tableb,只更新已更改的值SQL服務器比較表,並更新(如果更改)

+4

STOP - ** **觸發時間... :) – 2009-09-25 14:55:46

+1

多久你想表同步? – 2009-09-25 14:57:02

+3

對於一次性任務或定期?看看Redgate的比較工具,如果你想使用一個工具來做到這一點。 – RichardOD 2009-09-25 14:58:30

回答

0

您可以在源表上使用更新目標表的觸發器。

但是,如果有很大的音量可能會減慢插入/更新源相當糟糕。在這種情況下,我會將觸發器插入第三個表中。然後,計劃作業可以處理該表並刪除記錄(當然,適當使用事務處理)。

一種完全不同的方法是將觸發向上移動到應用程序中,並使用基於消息的方法。在這種情況下,你可以得到兩全其美的好處,因爲偵聽消息的進程將盡可能快地處理它們,從而實現對目標表的幾乎實時更新。

所以你可以吃你的蛋糕,並吃掉它。

3

到尼爾斯解決方案的一個替代方案是使用binary checksum並存儲在一個領域中的表,然後比較針對

不是說了一個更好的解決方案,只是給你一些選項。

+0

是的,一個更簡單的方法。如果負載很高,那麼最終可能成爲源表上鎖定問題的來源,而讀取它的過程確實是這樣。另外,當它實際上並不是表中數據的一部分時,通過添加這個信息來污染源表的數據模型。 – 2009-09-25 15:01:38

+0

尼爾,污染數據模型? 一個設計良好的數據庫通常包含的字段不能被用戶看到,因此不在數據模型中。有用於管理數據而不是信息的字段。比如創建記錄的日期和最後一次更新行的人。 如果你已經正確地編寫了你的​​應用程序代碼來只提取你想要的數據,而不是所有的(因爲其他原因你應該這樣做),這是沒有問題的。如果你使用select *(這不應該在生產數據庫上完成),那麼這是一個問題。 – HLGEM 2009-09-25 17:42:21

+0

這可以工作,並且比加入記錄中的每個表更快。在記錄創建和更新時創建和更新這個比在運行時嘗試計算10,000,000個binary_checksums更好。 – HLGEM 2009-09-25 17:43:38

1

在一次嘗試多行:

UPDATE a 
    SET IntCol=b.IntCol 
     ,varcharCol=b.varcharCol 
     ,DatetimeCol=b.DatetimeCol 
    FROM TableA   a 
     INNER JOIN (SELECT pk,IntCol,varcharCol,DatetimeCol FROM TableA 
        EXCEPT 
        SELECT pk,IntCol,varcharCol,DatetimeCol FROM TableB 
        ) dt ON a.pk=dt.pk