SQL使用事务交换两个数字

时间:2015-07-13 17:06:56

标签: sql sql-server tsql

我正在尝试使用交易在数据库中为两名员工交换两个电话号码。我不确定我是否理解SQL中的变量,因为我不断收到错误。我是否为交换引用了这些变量错误?以下是我到目前为止的情况:

use lunches;

start transaction;

set @phone1 = (select phone_number
from l_employees
where employee_id = '205');

set @phone2 = (select phone_number
from l_employees
where employee_id = '209');

update l_employees
set phone1 = @phone2, phone2 = @phone1;

我收到一个错误,即字段列表中有一个未知的列'phone1'。如何获取我创建的两个变量中的值?

提前致谢!

2 个答案:

答案 0 :(得分:4)

不需要多个语句或变量,这可以在一个语句中完成:

update emp
  set phone_number = case 
                       when 205 then (select phone_number from emp where employee_id = 209) 
                       when 209 then (select phone_number from emp where employee_id = 205) 
                     end
where employee_id in (205, 209);

这对于并发更新也是安全的,因为要执行的第一个语句将锁定正在更新的两行。它是原子的,因为它只是一个声明。

答案 1 :(得分:3)

根据您的SELECT,您的UPDATE查询应该是:

update l_employees
set phone_number = @phone2
where employee_id = '205'

update l_employees
set phone_number = @phone1
where employee_id = '209'

您为什么要使用交易?您是否期望在操作过程中更改任一电话号码?似乎不太可能有4个查询速度非常快。