探討Update語句的執行順序

DengXingJie 2009-09-04 04:02:19
測試數據

create table ta(empNo varchar(8) ,empName varchar(20),nIndex int)

insert into ta
select 'A0001','張三',null
union
select 'A0002','李四',null
union
select 'A0003','王二',null
union
select 'A0004','趑六',null


Update語句

declare @tmpIndex int
set @tmpIndex=1
update ta set nIndex=@tmpIndex,@tmpIndex=@tmpIndex+1


查看結果

select * from ta

empNo empName nIndex
-------- -------------------- -----------
A0001 張三 2
A0002 李四 3
A0003 王二 4
A0004 趑六 5

(4 row(s) affected)


--我的本意是要如下的結果
empNo empName nIndex
-------- -------------------- -----------
A0001 張三 1
A0002 李四 2
A0003 王二 3
A0004 趑六 4

(4 row(s) affected)



按照我個人的想法是:
第一條記錄:
先執行set nIndex=@tmpIndex,也就是說給nIndex=1,然後再執行@tmpIndex=@tmpIndex+1,此時tmpIndex=2
第二條記錄:
先執行set nIndex=@tmpIndex,也就是說給nIndex=2,然後再執行@tmpIndex=@tmpIndex+1,此時tmpIndex=3

可是實際上卻提前+1了,有哪位可以說說原理?
...全文
471 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
DengXingJie 2009-09-05
  • 打赏
  • 举报
回复
謝謝各位了
fenlin 2009-09-04
  • 打赏
  • 举报
回复
学习了...
  • 打赏
  • 举报
回复
学习了
ks_reny 2009-09-04
  • 打赏
  • 举报
回复
這讓我想起了C++中的 i++ 和 ++i 了.
DengXingJie 2009-09-04
  • 打赏
  • 举报
回复
原來還有個“變量優先”啊
受教了
soft_wsx 2009-09-04
  • 打赏
  • 举报
回复
declare @tmpIndex int
set @tmpIndex=0
update ta set @tmpIndex=@tmpIndex+1,nIndex=@tmpIndex
这样更好理解
soft_wsx 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 htl258 的回复:]
从左到右,变量优先,逐行更新.
[/Quote]
if OBJECT_ID('ta') is not null drop table ta
create table ta(empNo varchar(8) ,empName varchar(20),nIndex int) --drop table ta

insert into ta
select 'A0001','張三',null
union
select 'A0002','李四',null
union
select 'A0003','王二',null
union
select 'A0004','趑六',null


declare @tmpIndex int
set @tmpIndex=0
update ta set nIndex=@tmpIndex,@tmpIndex=@tmpIndex+1

select * from ta

/*
empNo empName nIndex
A0001 張三 1
A0002 李四 2
A0003 王二 3
A0004 趑六 4
*/
ks_reny 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 playwarcraft 的回复:]
这也是一种常用的类循环的方式
[/Quote]
學習了.效率比遊標要高吧.
lihan6415151528 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 htl258 的回复:]
从左到右,变量优先,逐行更新.
[/Quote]
学习
wanshichen 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 htl258 的回复:]
从左到右,变量优先,逐行更新.
[/Quote]

学习,7楼的我的理解是:
逐行更新 一行一行更新,所以先变量赋值,然后更新第一行,然后再变量赋值,更新第二行……
xiequan2 2009-09-04
  • 打赏
  • 举报
回复
从左到右先变量赋值,然后更新
playwarcraft 2009-09-04
  • 打赏
  • 举报
回复
这也是一种常用的类循环的方式
playwarcraft 2009-09-04
  • 打赏
  • 举报
回复
变量优先字段
ks_reny 2009-09-04
  • 打赏
  • 举报
回复

爲什麽不是
empNo empName nIndex
-------- -------------------- -----------
A0001 張三 2
A0002 李四 2
A0003 王二 2
A0004 趑六 2
結果,語句中沒有循環語句呀
--小F-- 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 htl258 的回复:]
从左到右,变量优先,逐行更新.
[/Quote]

原版来了
htl258_Tony 2009-09-04
  • 打赏
  • 举报
回复
从左到右,变量优先,逐行更新.
lihan6415151528 2009-09-04
  • 打赏
  • 举报
回复
declare 
@tmpIndex int
@s int
set s = select count(*) from ta
set @tmpIndex=1
while(@tmpIndex<@s)
begin
update ta set nIndex=@tmpIndex
set @tmpIndex = @tmpIndex +1
end
SQL77 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fredrickhu 的回复:]
想起以前TONY哥还是石头哥说的经典语言了

从左到右  变量优先
[/Quote]
当初我问了几次,呜.....
--小F-- 2009-09-04
  • 打赏
  • 举报
回复
想起以前TONY哥还是石头哥说的经典语言了

从左到右 变量优先
SQL77 2009-09-04
  • 打赏
  • 举报
回复
declare @tmpIndex int
set @tmpIndex=1
update ta set nIndex=@tmpIndex,@tmpIndex=@tmpIndex+1

先将变量赋给他,再给变更加1
循环下去呀

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧