在没有第三个变量的情况下切换SQL Server中两个字段/列的值

Tel*_*ini 9 sql sql-server relational-database sql-server-2008

由于导入到名为CUSTOMERS的测试表时出错,我发现自己需要在SQL Server中切换两列的值.

我错误地将LASTNAME和FIRSTNAME的相应值导入相反的字段(即客户姓氏被导入名字,反之亦然).为了解决这个问题,我在SQL Server 2008 R2中运行了以下查询,当然不希望它工作:

UPDATE CUSTOMERS
SET LASTNAME=FIRSTNAME, FIRSTNAME=LASTNAME
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,它奏效了!我所拥有的有限的编程经验(高中,一些大学课程)总是遵循这样的范例:切换两个值需要存在第三个变量来"保持"其中一个初始值的值.换句话说,我预计必须运行以下查询:

UPDATE CUSTOMERS
SET SOMEOTHERFIELD = LASTNAME
SET LASTNAME = FIRSTNAME
SET FIRSTNAME = SOMEOTHERFIELD
Run Code Online (Sandbox Code Playgroud)

这种行为只出现在SQL Server 2008 R2中,还是代表了我缺少的关系理论的其他一些基本方面?

小智 5

这是因为更新的工作方式:

在set子句中构造一个伪表.通过将原始行中未提及的列中的值复制到新行来构建此表中的行.列一次全部分配.也就是说,工作单元是一行,而不是一次一列.最后一步是删除旧行并插入新行.在内部,更新是选择,删除,插入.