2010-11-16 10 views
46

tengo una tabla llamada Empleado¿Cómo puedo intercambiar valores de columna en el servidor sql 2008?

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

Quiero intercambiar los datos de la columna AttributeValue-AttributeName y AttributeName-AttributeValue

Por ejemplo:

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

Respuesta

67
UPDATE employee 
SET AttributeValue = AttributeName, 
    AttributeName = AttributeValue 

Sin embargo, a menos Ambas columnas tienen exactamente la misma definición, te arriesgas a perder información.

+0

"a menos que ambas columnas tienen la misma definición exacta, se corre el riesgo de perder información." - solo para estar seguro, ¿estás diciendo que a menos que las dos columnas tengan el mismo tipo de datos podríamos perder información? ¿O a qué te refieres por definición? thx – VoodooChild

+0

@VoodooChild - tipo de datos, sí. Aunque eso incluye precisión y tamaño si es relevante. – Oded

+3

No puedo creer que sea así de simple. Viniendo de una mentalidad C++, mi cerebro seguía diciendo "nah ... eso no funcionará. Ambos valores terminarán siendo lo que sea el valor inicial de' AttributeName' ". –

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

update Employee set AttributeValue = AttributeName, AttributeName = AttributeValue

3

Esto es realmente buen ejemplo

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

¿Puedes explicar el comportamiento? ¿El motor de base de datos asigna primero 'fname' a' @ temp', luego asigna 'lname' a' fname', luego '@ temp' a' lname'? Si este es el caso, ¿cómo se explica 'set a = b, b = a'? – Gqqnbig

+1

¿Por qué harías esto? No necesita una variable de intercambio, verifique la respuesta de 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 

salida

Query Result Screenshot

0

sólo cambio ambas columnas en una sola actualización:

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