2011-01-31 8 views
15

Sto provando a modificare una tabella per aggiungere una nuova colonna, quindi inserire una nuova riga in essa.SQL Server 2000 - ALTER TABLE + INSERT INTO = Errori?

ALTER TABLE Roles ADD ModifiedDate DateTime; 
INSERT INTO Roles (Name, [Description], CreatedBy, BuiltIn, Created, ModifiedDate) 
    VALUES ('Name', 'Description', 0, 1, GETDATE(), GETDATE()) 

ma ottengo:

Msg 207, Level 16, State 1, Line 1 
Invalid column name 'ModifiedDate'. 

quando si tenta di eseguire il codice SQL sopra in SQL Server Management Studio. Penso che questo sia un errore di Studio, non un errore del server. Se è stato eseguito SQL, dovrebbe funzionare come la colonna esisterebbe in quel punto.

Come posso aggiungere una nuova colonna a una tabella e quindi inserirla in quella tabella?

Versioni:

  • SQL Server SQL Server Management Studio 2008

risposta

18

come previsto. SQL Server non viene eseguito riga per riga. Compila e analizza il batch e, quando ciò accade, la colonna non esiste.

È necessario separare le 2 azioni così

ALTER TABLE Roles ADD ModifiedDate DateTime; 
EXEC (' 
    INSERT INTO Roles (Name, [Description], CreatedBy, BuiltIn, Created, ModifiedDate) 
    VALUES (''Name'', ''Description'', 0, 1, GETDATE(), GETDATE()) 
') 

A "GO" è un separatore lotto solo per strumenti client e non viene riconosciuto dal server

+1

C'è un modo per disattivare questo dosaggio? Ho questo problema su 20 -30 elementi nel mio file SQL. il suo aggiornamento di un database da una versione all'altra. – Justin808

+1

@ Justin808: non senza SQL dinamico o GO. È come SQL Server crea piani di esecuzione ed è fondamentale per il suo funzionamento. Non è procedurale/linea per linea. – gbn

+0

+1 la tua soluzione è migliore di quella che ho pubblicato. – Lamak

0

Che dire, affari?

BEGIN TRANSACTION; 
ALTER TABLE Roles ADD ModifiedDate DateTime; 
GO; 
COMMIT TRANSACTION; 

BEGIN TRANSACTION; 
INSERT INTO Roles (Name, [Description], CreatedBy, BuiltIn, Created, ModifiedDate) VALUES ('Name', 'Description', 0, 1, GETDATE(), GETDATE()); 
GO; 
COMMIT TRANSACTION;