2011-01-31 21 views
15

Estoy tratando de modificar una tabla para agregar una nueva columna, luego inserte una nueva fila en ella.SQL Server 2000 - ALTER TABLE + INSERT INTO = ¿Errores?

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

pero me sale:

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

cuando trato de ejecutar el SQL anterior en SQL Server Management Studio. Creo que este es un error de Studio, no un error del servidor. Si se ejecutó el SQL, debería funcionar ya que la columna existiría en ese punto.

¿Cómo puedo agregar una nueva columna a una tabla y luego insertarla en esa tabla?

Versiones:

  • SQL Server 2000
  • SQL Server Management Studio 2008

Respuesta

18

como se esperaba. SQL Server no ejecuta línea por línea. Compila y analiza el lote, y cuando esto sucede, la columna no existe.

Usted necesidad de separar las 2 acciones por lo tanto

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" es un separador de lotes sólo para herramientas de cliente y no es reconocido por el servidor

+1

¿Hay alguna manera de desactivar esta mezcla? Tengo este problema sobre 20-30 elementos en mi archivo SQL. está actualizando una base de datos de una versión a otra. – Justin808

+1

@ Justin808: no sin SQL dinámico o IR. Así es como SQL Server crea planes de ejecución y es fundamental para su funcionamiento. No es de procedimiento/línea por línea. – gbn

+0

+1 su solución es mucho mejor de lo que publiqué. – Lamak

0

¿Qué hay de transations?

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; 
Cuestiones relacionadas