2015-06-02 25 views
0

我为什么看到两个语句之间的区别有点困惑。我试图简单地递增1的INT列,所以设置值1,2,3,4,等:包含多个集合的更新语句

QUERY#1产生所期望的结果:

DECLARE @a int 
SET @a = 0 
UPDATE #jc_TEMP 
SET num = @a, @[email protected]+1 

QUERY#2将所有行设置为0:

DECLARE @a int 
SET @a = 0 
UPDATE #jc_TEMP 
SET num = @a 
SET @[email protected]+1 

显然我在这里错过了一些东西,但对肉眼来说它们看起来是相同的。第二个查询中的局部变量回滚是否存在?

+0

任何特定的数据库? – GolezTrol

+0

你的第二个查询没有'WHERE'子句,所以它会将每条记录设置为0.第一个查询在更新时也会增加'@ a'变量。 – Siyual

+0

@Siyual - 有没有其他方法可以在不使用游标的情况下重写第一个查询?另外,为什么缺少where子句对查询#1没有问题?谢谢! – tchock

回答

3

由于第二 “UPDATE” 实际上是两个分开的语句

1 - DECLARE @a int 
2 - SET @a = 0 
3 - UPDATE #jc_TEMP 
     SET num = @a 

4 - SET @[email protected]+1 

UPDATE集所有行的@a的值(其为0),则语句增量@a

你的第一个UPDATE

1 - DECLARE @a int 
2 - SET @a = 0 
3 - UPDATE #jc_TEMP 
     SET num = @a, 
      @[email protected]+1 

增量@a值的每一行,所以你看在数据的增量。

+0

这是困扰我的事情,但为什么第一行得到更新到1而不是0在这里? SET顺序不是从左到右?我会假设第一行用@a值更新为0,然后将该变量更新为+1,并将下一行更新为1. – tchock

+0

我也是,但这可能是一个实现细节 - 什么类型的你正在使用数据库吗? SQL Server? MySQL的?甲骨文? –

+0

我正在使用SQL Server。 – tchock