Когда вам нужно выполнить более сложную операцию с каждой строкой, чем то, что позволяет простое обновление, вы можете попробовать:
- Написать пользовательскую функцию и использовать ее в обновлении (вероятно, все еще медленно)
- Поместить данные во временную таблицу и использовать их в ОБНОВЛЕНИИ ... ОТ:
Знаете ли вы о синтаксисе ОБНОВЛЕНИЕ ... ОТ? Это довольно мощно, когда все становится сложнее:
UPDATE
MyTable
SET
Col1 = CASE WHEN b.Foo = "Bar" THEN LOWER(b.Baz) ELSE "" END,
Col2 = ISNULL(c.Bling, 0) * 100 / Col3
FROM
MyTable
INNER JOIN MySecondTable AS b ON b.Id = MyTable.SecondId
LEFT JOIN ##MyTempTable AS c ON c.Id = b.ThirdId
WHERE
MyTabe.Col3 > 0
AND b.Foo NOT IS NULL
AND MyTable.TheDate > GETDATE() - 10
Пример полностью составлен и может не иметь особого смысла, но вы получите представление о том, как выполнить более сложное обновление без использования курсора. Конечно, временная таблица не обязательно потребуется для его работы. : -)