我有一个表col1 float,col2 float包含以下数据:
1,2
3,4
查询后:
UPDATE MyTable SET col1 = 100, col2 = col1
执行,行为:
100,1
100,3
显然,当更新col2时,会使用旧的,未更新的col1值。是否可以使用新值更新col2,参考col1或者我必须将值(100)写入两次?我想使用自动生成的查询,并且更容易保留公式。
此致
答案 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)