2016-06-09 2 views
3

Я хочу обновить два поля в таблице, а второе зависит от нового значения первого. Также вычисление первого является интенсивным, поэтому я не хочу его выполнять дважды. Для того, чтобы сделать себя более ясным здесь пример, который работает, но выполняет вычисления дважды:Могу ли я повторно использовать значение в заявлении об обновлении?

update MyTable 
set col1 = dbo.HeavyCalculationFunction(), 
    col2 = dbo.HeavyCalculationFunction() + 1 

То, что я хотел бы сделать, это:

update MyTable 
set col1 = dbo.HeavyCalculationFunction(), 
    col2 = col1 + 1 

Это также executs успешно, но использует старое значение col1 когда это вычисляя новое значение col2. Так же можно использовать новый, то есть:

update MyTable 
set col1 = dbo.HeavyCalculationFunction(), 
    col2 = col1(NEW VALUE) + 1 
+0

вы не могли бы обернуть это в сделке и просто сделать два заявления обновления, если вы не хотите, чтобы вычислить, что поле в два раза? –

+1

как насчет сохранения результата функции в переменной –

+0

Перед выполнением команды полного обновления будет сохранено новое значение в col1. Вы можете использовать два оператора обновления –

ответ

2

Я хотел бы предложить использовать переменная для сохранения результата функции.

Declare @tempData [some data type] 
SET @tempData = dbo.HeavyCalculationFunction(); 

update MyTable 
set col1 = @tempData, 
    col2 = @tempData + 1 
+0

Это не сработает для нескольких записей (поскольку HeavyCalculationFunction фактически использует другое поле из запись, о которой я не упоминал), но идея привела меня к решению, выше которого работает – Vladimir

2

Попробуйте использовать переменную:

DECLARE @Varname <TheType> 
SELECT @Varname = dbo.HeavyCalculationFunction() 
update MyTable 
    set col1 = @Varname, 
     col2 = @Varname + 1 

Или два обновления заявления:

update MyTable 
    set col1 = dbo.HeavyCalculationFunction(), 

update MyTable 
    set col2 = col1 + 1 
3

Спасибо за идею @MyoMyintAung:

declare @c1 int 
update MyTable 
set @c1 = col1 = dbo.HeavyCalculationFunction(), 
    col2 = @c1 + 1 
+0

Не было ли это благодаря моей идее? – sagi

+0

MyoMyintAung был быстрее вас, см. Комментарий выше. Но спасибо вам, я поддержал ваш ответ. – Vladimir

+0

На самом деле я был быстрее @владимир – sagi

Смежные вопросы