Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在sql server 2008中交换列值?_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

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

如何在sql server 2008中交换列值?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一张叫Employee的桌子 Eno ename AttributeValue AttributeName 1 aa a123 abc 2 bbb b123 dcf 3 cc c7sd wew3 我想将数据从列AttributeValue交换到AttributeName和Attribute

我有一张叫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

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

更新员工集AttributeValue=AttributeName,AttributeName=AttributeValue
这是一个很好的例子

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;

输出


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

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

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

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";
如果您有链接的功能视图,则必须在之前备份它们,之后恢复它们。

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

更新员工
设置attributeValue=temp

“除非两列的定义完全相同,否则您有丢失信息的风险。”-请确定,您是说除非两列的数据类型相同,否则我们可能丢失信息?或者你所说的定义是什么?thx@VoodooChild-数据类型,是。虽然这包括精度和尺寸,如果相关的话。真不敢相信它这么简单。从C++思维模式来看,我的大脑一直在说:“不……那是行不通的。这两个值最终将成为<代码>初始值>属性> <代码>。”说出你想要的,而不是如何完成它。C++的方法让我感到非常的不安,这太棒了!太容易了哇!你能解释一下这种行为吗?数据库引擎是否首先将
fname
分配给
@temp
,然后将
lname
分配给
fname
,然后将
@temp
分配给
lname
?如果是这种情况,您如何解释设置a=b,b=a?为什么要这样做?您不需要交换变量,请检查Oded的答案。
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
Update registration
Set AttributeName = AttributeValue ,
    AttributeValue = AttributeName where id in (1,2,3)
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";