SQL Server: ОБНОВЛЕНИЕ MyTable SET col1 = значение, col2 = col1 - PullRequest
0 голосов
/ 25 августа 2011

У меня есть таблица col1 float, col2 float со следующими данными:

1,2

3,4

После запроса:

UPDATE MyTable SET col1 = 100, col2 = col1

выполняется, строки:

100,1

100,3

Очевидно, что старое, не обновленное значение col1 используется при обновлении col2. Можно ли обновить col2 новым значением, ссылаясь на col1, или мне нужно дважды записать значение (100)? Я хочу использовать автоматически сгенерированные запросы, и легче сохранять формулы.

С уважением,

Ответы [ 5 ]

4 голосов
/ 25 августа 2011

Вот еще одна альтернатива:

DECLARE @x float;

UPDATE MyTable
SET
  @x = col1 = <i>formula</i>,
  col2 = @x * …
OPTION (MAXDOP 1)

или:

DECLARE @x float;

UPDATE MyTable
SET
  @x = <i>formula</i>,
  col1 = @x,
  col2 = @x * …
OPTION (MAXDOP 1)

OPTION (MAXDOP 1), чтобы обеспечить последовательный порядок оценки назначений.

2 голосов
/ 25 августа 2011

Почему вы не используете скалярную функцию? Таким образом, вы можете инкапсулировать свой код в одно место и вызывать его для каждого столбца, который вы хотите обновить. Вы даже можете передать ему параметры.

CREATE FUNCTION [dbo].[doStuff]
(
    @myInput
)
RETURNS INT 
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @VAL INT

SET @VAL = @myInput * 100

RETURN @VAL    
END

Затем вы делаете это:

UPDATE MyTable SET col1 = [dbo].doStuff(1), col2 = [dbo].doStuff(2)
2 голосов
/ 25 августа 2011

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

1 голос
/ 25 августа 2011

Вы можете выполнить расчет в cross apply и использовать значение в обновлении, чтобы избежать добавления одной и той же логики в более чем одном месте.

declare @T table (Col1 float, Col2 float)

insert into @T values(1, 2),(3, 4)

update T set
  Col1 = C.Value,
  Col2 = C.Value * pi() / 4
from @T as T
  cross apply (select 100*100) as C(Value)
1 голос
/ 25 августа 2011

Ваш код всегда может генерировать два оператора обновления:

UPDATE MyTable SET Col1 = 100;
UPDATE MyTable SET Col2 = Col1;

Но тогда, если ваши запросы действительно реалистичны и у вас есть предложение WHERE, вам придется повторить предложение WHERE дваждытак что вы ничего не получили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...