2010-11-16 11 views
46

mam tabela, urzędnikJak zmienić wartości kolumn w serwerze sql 2008?

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

że chce wymieniać dane z kolumny AttributeValue do AttributeName i AttributeName do AttributeValue

Na przykład:

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

Odpowiedz

67
UPDATE employee 
SET AttributeValue = AttributeName, 
    AttributeName = AttributeValue 

Jednak chyba obie kolumny mają dokładnie taką samą definicję, ryzykujesz utratę informacji.

+0

„chyba że obie kolumny mają taką samą definicję, istnieje ryzyko utraty informacji.” - żeby się upewnić, czy mówisz, chyba że dwie kolumny są tego samego typu, że możemy stracić informacje? Albo co masz na myśli z definicji? thx – VoodooChild

+0

@VoodooChild - typ danych, tak. Chociaż w razie potrzeby obejmuje to precyzję i rozmiar. – Oded

+3

Nie mogę uwierzyć, że to takie proste. Wychodząc z myślenia w C++, mój mózg ciągle powtarzał: "nah ... to nie zadziała, obie wartości będą w końcu takie same, jak początkowa wartość" AttributeName "." –

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

update Employee set AttributeValue = AttributeName, AttributeName = AttributeValue

3

To jest naprawdę dobry przykład

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

Czy możesz wyjaśnić zachowanie? Czy silnik bazy danych najpierw przypisuje 'fname' do' @ temp', a następnie przypisuje 'lname' do' fname', a następnie '@ temp' do' lname'? Jeśli tak, to jak wyjaśnić "set a = b, b = a"? – Gqqnbig

+1

Dlaczego miałbyś to zrobić? Nie potrzebujesz zmiennej swap, sprawdź odpowiedź Odeda. – 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 

Wyjście

Query Result Screenshot

0

Wystarczy zamienić obie kolumny w jednej aktualizacji:

Update registration 
Set AttributeName = AttributeValue , 
    AttributeValue = AttributeName where id in (1,2,3) 
Powiązane problemy