Моя первая мысль, когда вы говорите о производительности, - убедиться, что у вас есть индекс для VisitTransitions.VisitId (и, конечно, Visit.VisitId). Но с точки зрения переписывания без итераций, мне интересно, рассматривали ли вы что-то вроде следующих двух утверждений:
UPDATE vt
SET
vt.TimeIn = CASE WHEN vt.AreaName = '1' THEN v.TimeIn WHEN vt.AreaName = '2' THEN DateAdd(ss, 500, v.TimeIn) ELSE DateAdd(ss, 1000, v.TimeIn) END,
vt.TimeOut = CASE WHEN vt.AreaName = '1' THEN DateAdd(ss, 500, v.TimeIn) WHEN vt.AreaName = '2' THEN DateAdd(ss, 1000, v.TimeIn) ELSE DateAdd(ss, 1500, v.TimeIn) END
FROM VisitTransitions vt
INNER JOIN Visit v
ON v.VisitID = vt.VisitID
INNER JOIN #temp t
ON v.VisitID = t.VisitID;
UPDATE v
SET
v.TimeOut = DateAdd(ss, 1500, v.TimeIn)
FROM Visit v
ON v.VisitID = vt.VisitID
INNER JOIN #temp t
ON v.VisitID = t.VisitID;
Это может быть не совсем верно, если у вас есть AreaNames, кроме (1,2,3) , но в принципе я думаю, что это сработает, и вы могли бы построить его.