如何在SQL Server 2008中交换列的值?

66
我有一个名为"Employee"的表格。
 Eno     ename     AttributeValue      AttributeName  
 1       aa           a123             abc
 2       bbb          b123             dcf
 3       cc           c7sd             wew3

我想要交换AttributeValue列和AttributeName列中的数据,并将AttributeName列中的数据交换到AttributeValue列中,反之亦然。

例如:

Eno     ename     AttributeValue   AttributeName  
1       aa        abc              a123
2       bbb       dcf              b123
3       cc        wew3             c7sd
8个回答

112
UPDATE employee
SET AttributeValue = AttributeName, 
    AttributeName = AttributeValue

但是,除非两个列有完全相同的定义,否则您可能会丢失信息。


1
除非这两列具有完全相同的定义,否则您会有丢失信息的风险。 - 只是为了确认,您是说除非这两个列是相同的数据类型,否则我们可能会丢失信息?或者您所说的定义是指什么?谢谢。 - VoodooChild
@VoodooChild - 数据类型,是的。如果相关的话,这包括精度和大小。 - Oded
11
难以相信这么简单。从C++思维方式来看,我的大脑一直在说“不...那行不通。两个值最终都将成为AttributeName的初始值。” - Drew Chapin
14
这是声明式编程。说出你想要什么,而不是如何实现它。 - Bacon Bits
C++的方法让我崩溃了,这太棒了!太容易了,哇! - Jeancarlo Fontalvo
我查了一下,根据SQL标准它实际上是正确的。以下内容摘自SQL-1992有关'update statement: searched'的会话:'在更新T的任何行之前,对于T的每一行,值表达式都会被有效地求值。' - LordCapybara

14
Update employee
Set attributeValue = attributeName,
    attributeName = attributeValue

7

更新Employee表,将AttributeValue的值赋给AttributeName,同时将AttributeName的值赋给AttributeValue。


6

所有先前的技术对于大表格来说都很慢,它们移动数据而不是重命名列,这是一个简单的解决方案:

ALTER TABLE "amplitude"
RENAME COLUMN "start_hour_displayed" TO "temp";

ALTER TABLE "amplitude"
RENAME COLUMN "start_hour" TO "start_hour_displayed";

ALTER TABLE "amplitude"
RENAME COLUMN "temp" TO "start_hour";

如果您有链接函数的视图,则必须在备份之前备份它们,并在恢复后进行恢复。


3

这是一个非常好的例子。

SELECT * from employees;
Go

DECLARE @temp as varchar(20)
update employees
set    @temp = fname,
       fname = lname,
       lname = @temp
WHERE  deptno = 10;
GO

SELECT * from employees;

Result


你能解释一下这个行为吗?数据库引擎是先将 fname 赋值给 @temp,然后将 lname 赋值给 fname,最后将 @temp 赋值给 lname 吗?如果是这样的话,那么 set a=b, b=a 又该如何解释呢? - Gqqnbig
3
为什么要这样做?你不需要一个交换变量,看看Oded的答案就好了。 - sventevit

1
Declare @myTable Table (id int, first_name varchar(50), last_name varchar(50));

Select * from Student

Insert Into @myTable (id, first_name, last_name) Select id, last_name, first_name from Student

    MERGE
    INTO    Student std
    USING @myTable tmp
    ON std.id = tmp.id
    WHEN MATCHED THEN
    UPDATE
    SET std.first_name = tmp.first_name,
    std.last_name = tmp.last_name;

Select * from Student

输出

Query Result Screenshot


0

更新员工 SET AttributeValue = AttributeName, AttributeName = AttributeValue 不正确,最好创建一个临时列并尝试代码 更新员工 SET temp= AttributeName 然后再次执行 更新员工 SET AttributeName = AttributeValue 再次执行

更新员工 SET AttributeValuee= temp


0

只需在单个更新中交换两列:

Update registration
Set AttributeName = AttributeValue ,
    AttributeValue = AttributeName where id in (1,2,3)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接