2012-11-06 13 views
50

Jak dodać kolumnę do tabeli programu SQL Server z wartością domyślną, która jest równa wartości istniejącej kolumny?Dodaj kolumnę do tabeli z wartością domyślną równą wartości istniejącej kolumny

Próbowałem to oświadczenie T-SQL:

ALTER TABLE tablename 
ADD newcolumn type NOT NULL DEFAULT (oldcolumn) 

ale to daje błąd:

The name "oldcolumn" is not permitted in this context. Valid expressions are constants, constant expressions, and (in some contexts) variables. Column names are not permitted.

+5

Domyślną wartością może być stała, a nie inna kolumna. To chyba wymaga spustu. –

+1

ok, jak mogę to zrobić, jestem nowy w sql. – doesdos

+1

Czy to zawsze będzie domyślne, czy jest to tylko do wypełniania kolumny dla istniejących wierszy, podczas gdy nowa kolumna jest dodawana do tabeli? –

Odpowiedz

49

Spróbuj tego:

ALTER TABLE tablename ADD newcolumn type NOT NULL DEFAULT (0) 
Go 
Update tablename SET newcolumn = oldcolumn Where newcolumn = 0 
Go 
+0

Niesamowite, chciałem zapytać, jak to zrobić, działało jak czar dla mnie! –

+3

.. tak, ale będzie działać tylko dla istniejących wierszy. Nie ustawi wartości [nowa kolumna] po wstawieniu nowych wierszy. Potrzebujesz wyzwalacza AFTER INSERT itp. – Milan

+6

Dodaje to potencjalnie niezamierzone ograniczenie domyślne do tabeli –

10

nie lubię ich bardzo dużo ale oto jak można to zrobić z wyzwalaczem AFTER INSERT:

CREATE TRIGGER TableX_AfterInsert_TRG 
    ON TableX 
AFTER INSERT 
AS 
    UPDATE TableX AS t 
    SET t.newcolumn = t.oldcolumn 
    FROM Inserted AS i 
    WHERE t.PK = i.PK ;    -- where PK is the PRIMARY KEY of the table 
7

Metoda wyzwalania AFTER INSERT obejmuje narzut ze względu na dodatkową instrukcję UPDATE. Proponuję za pomocą INSTEAD OF INSERT spust, co następuje:

CREATE TRIGGER tablename_on_insert ON tablename 
INSTEAD OF INSERT 
AS 
INSERT INTO tablename (oldcolumn, newcolumn) 
SELECT oldcolumn, ISNULL(newcolumn, oldcolumn) 
FROM inserted 

to nie działa choć jeśli oldcolumn jest kolumną automatycznego tożsamości.

-3

Myślę, że zadziała, jeśli użyjesz Set Identity_Insert <TableName> OFF, a po wstawionym Oświadczeniu, które właśnie napisałeś, używaj Set Identity_Insert <TableName> ON.

1

Aby przedłużyć Kapil „s odpowiedź i uniknąć niechcianej domyślne ograniczenie, spróbuj tego:

ALTER TABLE tablename ADD newcolumn type NOT NULL CONSTRAINT DF_TMP_TABLENAME_NEWCOLUMN DEFAULT -9999 
Go 
Update tablename SET newcolumn = oldcolumn 
Go 
ALTER TABLE tablename DROP CONSTRAINT DF_TMP_TABLENAME_NEWCOLUMN 
Go 

Wymień -9999 przez 'kod NODATA' jeśli typ jest varchar, nvarchar, datetime, albo ... wszelkie kompatybilne dane dla innych typów: określona wartość nie ma znaczenia, zostanie wyczyszczona drugą instrukcją.

Powiązane problemy