2012-11-06 17 views
50

Come aggiungere una colonna a una tabella di SQL Server con un valore predefinito uguale al valore di una colonna esistente?Aggiungere una colonna a una tabella con un valore predefinito uguale al valore di una colonna esistente

Ho provato questo istruzione T-SQL:

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

ma sta dando un errore:

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

Il valore predefinito può essere una costante, non un'altra colonna. Questo ha bisogno di un grilletto, penso. –

+1

ok, come posso farlo, sono nuovo in sql. – doesdos

+1

È sempre l'impostazione predefinita, oppure è solo per popolare la colonna per le righe esistenti mentre la nuova colonna viene aggiunta alla tabella? –

risposta

49

Prova questo:

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

Fantastico, stavo per chiedergli come fare, ha funzionato come un incantesimo per me! –

+3

.. sì, ma funzionerà solo per le righe esistenti. Non imposterà il valore [newcolumn] quando vengono inserite nuove righe. È necessario il trigger AFTER INSERT, ecc. – Milan

+6

Questo aggiunge un vincolo predefinito probabilmente non voluto sulla tabella –

10

Non mi piacciono molto ma ecco come si potrebbe fare questo con un trigger 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

L'approccio di trigger AFTER INSERT comporta un sovraccarico dovuto all'istruzione extra UPDATE. Suggerisco utilizzando un INSTEAD OF INSERT grilletto, come segue:

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

Questo non funziona se se la oldcolumn è una colonna di auto-identità.

-3

Penso che funzionerà se si utilizza Set Identity_Insert <TableName> OFF e dopo l'istruzione di inserimento che è stato scritto basta usare Set Identity_Insert <TableName> ON.

1

Per estendere Kapil 'risposta s, ed evitare il vincolo predefinito indesiderato, provate questo:

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 

Sostituire -9999 da 'NODATA' se il tipo è varchar, nvarchar, datetime, ... o qualsiasi dato compatibile per altri tipi: il valore specifico non importa, sarà cancellato dalla seconda istruzione.

Problemi correlati