2011-12-19 73 views
2

我正在從SQL函數生成數據的查詢中創建臨時表。我想用這個臨時表來爲臨時表中的每一行數據執行插入。什麼是繼續這個最好的方式?Foreach,光標還是別的?

#tmpTable如下(不爲簡單起見顯示的所有列):

EmpID  WorkHours  HourlyEquivalent  WeekOf 
asmith  12    8.94     12/5/2011 
bjones  23.5   12.75    12/5/2011 
criley  40    7.89     12/5/2011 

表EmpHours將已經與員工小時充滿,但需要與他們的每小時當量(從計算出的更新上述功能)。我想從臨時表爲每個員工執行更新如下:

UPDATE EmpHours 
SET HourlyEquivalent 
WHERE WeekOf = #tmpTable.WeekOf 
    AND EmpID = #tmpTable.EmpID 

的UPDATE我需要執行的數量是50歲以下,如果該事項。

回答

4

SQL在單個命令中執行此類操作時效率更高,而不是逐行更新。儘管在這種情況下你沒有很多行,但採用基於集合的方法而不是使用循環或遊標仍然是一個好習慣。

UPDATE e 
SET HourlyEquivalent = t.HourlyEquivalent 
FROM 
    EmpHours e JOIN 
    #tmpTable t ON t.WeekOf = e.WeekOf AND t.EmpID = e.EmpID 
+1

+1總是基於集合運算 – squillman 2011-12-19 17:01:47

+0

+ 1 - 總是建議避免RBAR技術(Row By * Agonizing * Row) – MatBailie 2011-12-19 17:25:51

+0

謝謝,效果很好。 – BrianKE 2011-12-23 15:04:36

1

insert所有在另一個表的#tmpTable行,你可以做到這一切在一次。 假設這兩個表具有相同的結構,這將是這樣的:

insert into tablename 
select EmpID, WorkHours, HourlyEquivalent, WeekOf from #tmpTable 

像邁克爾說,更新是這樣的:

UPDATE e 
SET HourlyEquivalent = t.HourlyEquivalent 
FROM 
    EmpHours e JOIN 
    #tmpTable t ON t.WeekOf = e.WeekOf AND t.EmpID = e.EmpID