Foreach, Cursor или что-то еще? - PullRequest
       31

Foreach, Cursor или что-то еще?

2 голосов
/ 19 декабря 2011

Я создаю временную таблицу из запроса, который генерирует данные из функций SQL. Я хотел бы использовать эту временную таблицу для выполнения вставки для каждой строки данных из временной таблицы. Каков наилучший способ продолжить это?

# 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

Количество ОБНОВЛЕНИЙ, которые мне нужно будет выполнить, не превышает 50, если это имеет значение.

Ответы [ 2 ]

4 голосов
/ 19 декабря 2011

SQL гораздо эффективнее выполнять подобные операции в одной команде, а не построчное обновление.Даже если в этом сценарии не так много строк, все равно хорошей привычкой будет использовать подход, основанный на множестве, вместо использования цикла или курсора.

UPDATE e
SET HourlyEquivalent = t.HourlyEquivalent
FROM
    EmpHours e JOIN
    #tmpTable t ON t.WeekOf = e.WeekOf AND t.EmpID = e.EmpID
1 голос
/ 19 декабря 2011

К 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
...