потерять курсор. Сейчас. (См. Здесь, почему: Почему использование курсоров в SQL Server считается плохой практикой? ).
Не будучи грубым, вы, похоже, используете процедурный подход программистов к SQL, который почти всегда будет неоптимальным.
Если то, что вы делаете, сложно, и вы не уверены, я бы сделал это в три этапа:
1) Выбор основных данных во временную таблицу с помощью вставки или выбора в.
2) Используйте update для выполнения манипуляций - вы можете сделать это, просто обновляя существующие столбцы, или вам может понадобиться добавить несколько дополнительных в правильном формате при создании временной таблицы. Вы можете использовать несколько операторов обновления, чтобы разбить его дальше, если хотите.
3) Выберите его там, где вы хотите.
Если вы хотите вызвать все это как один шаг, то вы можете затем обернуть все это в хранимую процедуру.
Это облегчает отладку и облегчает работу с кем-то еще, если это необходимо. Вы можете разбить свои обновления на отдельные шаги, чтобы вы могли быстро определить, что пошло не так, где.
Это говорит о том, что я не верю, что то, что вы делаете, не может быть сделано с помощью одного оператора вставки. Это может быть не привлекательно, но я верю, что это можно сделать:
INSERT INTO NewTable
DATEPART(@VAL1) DateCol,
@STR(@VAL2 / 1.1) FloatCol,
@VAL3 + ' ' + @VAL1 ConcatCol
FROM TABLE_1 t1
INNER JOIN TABLE_2 t2 on t1.key = t2.foreignKey
INNER JOIN TABLE_3 t3 on t2.key = t3.foreignKey
DateCol, FloatCol и ConcatCol - это любые имена, которые вы хотите иметь в столбцах. Хотя они не нужны, лучше всего назначить их следующим образом: (а) это делает более понятным то, что вы делаете, и (б) некоторые языки борются с безымянными столбцами (и обрабатывают это очень неясным образом).