2011-12-19 9 views
2

SQL関数からデータを生成するクエリから一時テーブルを作成しています。このtempテーブルを使用して、tempテーブルの各行のデータを挿入したいとします。これを進める最善の方法は何ですか?Foreach、Cursorなど何か?

(簡単にするために示されていないすべての列)は次のよう#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を実行したい:

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

ことが重要ならば、私は実行する必要がある更新の数が50の下にあります。

答えて

4

SQLは、行単位の更新ではなく、1つのコマンドでこのような操作を行う方がはるかに効率的です。このシナリオでは非常に多くの行がありませんが、ループやカーソルを使用する代わりに、セットベースのアプローチをとるのは良い習慣です。別のテーブルで#tmpTable

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

+0

+を行く:マイケルは更新がこのようなものです、述べ同様

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

: は、両方のテーブルが、それはこのようなものだと同じ構造を持っていると仮定すると、 1 - 常にRBARのテクニックを避けるようアドバイスしてください(Row By * Agonizing * Row) – MatBailie

+0

ありがとうございました。 – BrianKE

1

insertへのすべての行は、あなたが一度にそれをすべて行うことができます。

UPDATE e 
SET HourlyEquivalent = t.HourlyEquivalent 
FROM 
    EmpHours e JOIN 
    #tmpTable t ON t.WeekOf = e.WeekOf AND t.EmpID = e.EmpID 
関連する問題