如何在 sql server 2008 中交换列值?

Posted

技术标签:

【中文标题】如何在 sql server 2008 中交换列值?【英文标题】:How do I swap column values in sql server 2008? 【发布时间】:2010-11-16 20:25:31 【问题描述】:

我有一张名为 Employee 的表

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

我想将AttributeValue 列中的数据交换到AttributeNameAttributeNameAttributeValue

例如:

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

【问题讨论】:

【参考方案1】:
UPDATE employee
SET AttributeValue = AttributeName, 
    AttributeName = AttributeValue

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

【讨论】:

"除非两列具有完全相同的定义,否则您可能会丢失信息。" - 只是为了确定,你是说除非两列是相同的数据类型,否则我们可以丢失信息?或者你的定义是什么意思?谢谢 @VoodooChild - 数据类型,是的。虽然这包括相关的精度和大小。 不敢相信这么简单。从 C++ 的思维方式出发,我的大脑一直在说“不……那行不通。这两个值最终都将是 AttributeName 的初始值。” @druciferre 这是声明式编程。说出你想要的,而不是如何完成它。 C++ 方法让我快要死了,这太棒了!好简单哇!【参考方案2】:
Update employee
Set attributeValue = attributeName,
    attributeName = attributeValue

【讨论】:

【参考方案3】:

update Employee set AttributeValue = AttributeName, AttributeName = AttributeValue

【讨论】:

【参考方案4】:

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

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";

如果您有链接的功能视图,您必须在之前备份它们并在之后恢复它们。

【讨论】:

【参考方案5】:

这是一个很好的例子

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;

【讨论】:

你能解释一下这种行为吗?数据库引擎是否首先将fname 分配给@temp,然后将lname 分配给fname,然后将@temp 分配给lname?如果是这样,你如何解释set a=b, b=a 你为什么要这样做?您不需要交换变量,请查看 Oded 的答案。【参考方案6】:
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

输出

【讨论】:

【参考方案7】:

只需在一次更新中交换两列:

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

【讨论】:

【参考方案8】:

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

更新员工 SET AttributeValuee= temp

【讨论】:

以上是关于如何在 sql server 2008 中交换列值?的主要内容,如果未能解决你的问题,请参考以下文章

sql server 如何限制某一列值的数值长度 如:在某一数据库中图书证号必须是6位数字???谢谢啦

在 SQL Server 中,如何选择共享公共列值的行?

如何从 SQL Server SELECT 语句返回新的 IDENTITY 列值?

如何更改sql server中的默认列值

如何根据列值SQL Server扩展表[重复]

如何在 SQL Server Management Studio 中将列值设置为 NULL?