如何在sql server 2008中交换列值?
我有一张叫Employee的桌子如何在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
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";