SQL Server:UPDATE MyTable SET col1 = value,col2 = col1

时间:2011-08-25 02:18:40

标签: tsql sql-server-2008

我有一个表col1 float,col2 float包含以下数据:

  

1,2

     

3,4

查询后:

UPDATE MyTable SET col1 = 100, col2 = col1
执行

,行为:

  

100,1

     

100,3

显然,当更新col2时,会使用旧的,未更新的col1值。是否可以使用新值更新col2,参考col1或者我必须将值(100)写入两次?我想使用自动生成的查询,并且更容易保留公式。

此致

5 个答案:

答案 0 :(得分:4)

这是尝试的另一种选择:

DECLARE @x float;

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

或:

DECLARE @x float;

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

OPTION (MAXDOP 1)用于确保分配评估的顺序。

答案 1 :(得分:2)

您的UPDATE语句会看到之前的版本,而不是之后的版本。如果你是自动生成查询,那么让代码转储公式两次就不那么容易了,因为选择其他一些列来引用它?那么,两次存储相同值的重点是什么?您也可以随时生成两个UPDATE语句作为替代语句。

答案 2 :(得分:2)

为什么不使用标量函数?这样,您可以将代码封装到一个位置,并为要更新的每个列调用它。你甚至可以将参数传递给它。

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)

答案 3 :(得分:1)

您始终可以让代码生成两个更新语句:

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

但是如果你的查询实际上是现实的并且你有一个WHERE子句,你必须重复WHERE子句两次,所以你没有真正获得任何东西。

答案 4 :(得分:1)

您可以在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)