我在此表单中有更新语句:
declare @v as int
update tbl
set @v=tbl.a=(select sum(amount) from anothertable at where at.x = tbl.y),
tbl.b = @v/2
我想使用变量的原因是避免使用子查询两次。问题是我没有找到任何引用说明这是安全的。在第一次分配后是否总是评估第二项分配(即tbl.b = @ v / 2)?
无法保证选择语句的评估顺序。这对于更新声明也是如此吗?
非常感谢。
答案 0 :(得分:2)
您可以通过以下方式摆脱对评估顺序的担忧:
UPDATE tbl
SET tbl.a = s.theSum,
tbl.b = s.theSum / 2
FROM tbl
INNER JOIN (
SELECT x, SUM(amount) AS thesum
FROM anothertable
GROUP BY x
) s ON s.x = tbl.y
答案 1 :(得分:1)
SQL是一种声明性语言。不要试图在其中做必要的构造。这不是C
。
任何语句(SELECT,DELETE,UPDATE,MERGE,INSERT,true,any)都不保证评估顺序。