2011-09-08 71 views
2

我需要根據是否發生任何值的更改來更新表中的幾千行。目前,我只是更新了所有的值,但不知道什麼更有效。我應該檢查所有的列,看看是否有任何更改和更新,或者我應該只是更新不管。例如更新更改行

update someTable Set 
    column1 = somevalue, 
    column2 = somevalue, 
    column3 = somevalue, 
    etc.... 
from someTable inner join sometable2 on 
    someTable.id = sometable2.id 
where 
    someTable.column1 != sometable2.column1 or 
    someTable.column2 != sometable2.column2 or 
    someTable.column2 != sometable2.column2 or 
    etc etc...... 

請告訴我更快的和最新的最佳實踐

回答

0

我相信這是最好的方法。

表和數據:

declare @someTable1 table(id int, column1 int, column2 varchar(2)) 
declare @someTable2 table(id int, column1 int, column2 varchar(2)) 

insert @someTable1 
      select 1,10 a, 'a3' 
union all select 2,20 , 'a3' 
union all select 3,null, 'a4' 

insert @someTable2 
      select 1,10, 'a3' 
union all select 2,19, 'a3' 
union all select 3,null, 'a5' 

更新:

UPDATE t1 
set t1.column1 = t2.column1, 
t1.column2 = t2.column2 
from @someTable1 t1 
JOIN 
(select * from @someTable2 
EXCEPT 
select * from @someTable1) t2 
on t2.id = t1.id 

結果:

select * from @someTable1 

id   a  b 
----------- -------- -- 
1   10  a3 
2   19  a3 
3   NULL  a5 
0

我發現,明確包括where子句中不包括任何操作更新更快地執行,對大型表格時,但是這是一個非常因人而異問題的類型。

如果可能,將兩種方法並排比較,並與一組實際數據進行比較。例如。如果您的表包含數百萬行,並且更新僅影響10個,請確保您的示例數據隻影響幾行。或者,如果大多數行可能會發生變化,請將您的示例數據反映出來。