2010-11-16 6 views
46

J'ai une table appelé employéComment échanger des valeurs de colonne dans sql server 2008?

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

Je veux échanger les données de la colonne AttributeValue-AttributeName et AttributeName-AttributeValue

Exemple:

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

Répondre

67
UPDATE employee 
SET AttributeValue = AttributeName, 
    AttributeName = AttributeValue 

Cependant, à moins les deux colonnes ont exactement la même définition, vous risquez de perdre des informations.

+0

« à moins que les deux colonnes ont exactement la même définition, vous risquez de perdre des informations. » - juste pour être sûr, est-ce que vous dites que si les deux colonnes sont du même type de données, nous pourrions perdre des informations? Ou que voulez-vous dire par définition? thx – VoodooChild

+0

@VoodooChild - type de données, oui. Bien que cela inclut la précision et la taille, le cas échéant. – Oded

+3

Je ne peux pas croire que c'est si simple. Venant d'un état d'esprit C++, mon cerveau disait "nah ... ça ne marchera pas, les deux valeurs finiront par être quelque soit la valeur initiale de" AttributeName "." –

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

update Employee set AttributeValue = AttributeName, AttributeName = AttributeValue

3

C'est vraiment bon exemple

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

Pouvez-vous expliquer le comportement? Le moteur de base de données affecte-t-il d'abord 'fname' à' @ temp', puis assigne 'lname' à' fname', puis '@ temp' à' lname'? Si c'est le cas, comment expliquez-vous 'set a = b, b = a'? – Gqqnbig

+1

Pourquoi le feriez-vous? Vous n'avez pas besoin de variable d'échange, vérifiez la réponse d'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 

Sortie

Query Result Screenshot

0

Juste les deux colonnes permuter dans une seule mise à jour:

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