2010-11-16 10 views
46

我有一個名爲僱員如何交換sql server 2008中的列值?

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 

回答

67
UPDATE employee 
SET AttributeValue = AttributeName, 
    AttributeName = AttributeValue 

但是,除非兩列的定義完全相同,您可能會失去信息。

+0

「除非兩列具有完全相同的定義,你的風險信息丟失。」 - 可以肯定的是,你是說,除非兩列是相同的數據類型,我們可以放寬信息?或者你的定義是什麼意思? thx – VoodooChild 2013-04-30 17:29:22

+0

@VoodooChild - 數據類型,是的。儘管如此,包括精度和大小。 – Oded 2013-05-01 09:36:46

+3

簡直不敢相信。從C++的思維模式來看,我的大腦不斷地說:「不行......這兩個值最終都會成爲」AttributeName「的初始值。」 – 2014-04-02 19:28:39

11
Update employee 
Set attributeValue = attributeName, 
    attributeName = attributeValue 
4

update Employee set AttributeValue = AttributeName, AttributeName = AttributeValue

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

+0

你能解釋一下這個行爲嗎?數據庫引擎是否首先將'fname'分配給'@ temp',然後將'lname'分配給'fname',然後'@ temp'分配給'lname'?如果是這樣的話,你如何解釋'set a = b,b = a'? – Gqqnbig 2015-08-20 23:54:56

+1

你爲什麼要這樣做?你不需要交換變量,查看Oded的答案。 – sventevit 2016-04-10 18:10:48

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

在一個單一的更新只是交換兩列:

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