2012-04-22 10 views
15

Dado el siguiente código SQL:problemas para actualizar nueva columna después de añadirlo

IF EXISTS (SELECT * FROM sys.columns WHERE name = 'NewFieldName' AND object_id = OBJECT_ID('dbo.MyTableName')) 
    RETURN 

-- Add NewFieldName column to part of the Summer 2012 release cycle. 
ALTER TABLE dbo.[MyTableName] ADD 
    [NewFieldName] SmallINT NOT NULL 
     CONSTRAINT DF_MyTableName_NewFieldName DEFAULT (2) 

UPDATE [MyTableName] SET NewFieldName = 1 WHERE [Name] = 'FindMe' --Update one specific value 

produce el siguiente mensaje de error:

Msg 207, nivel 16, estado 1, línea 10 Nombre de columna no válido ' NewFieldName '.

Estoy seguro de que me falta algo básico, pero intentar poner "IR" después del alter hace que la ACTUALIZACIÓN se ejecute cada vez y no quiero hacer eso.

¿Cómo puedo estructurar esta declaración para que compruebe si la columna existe y, si no la agrega, y luego establecer los valores como se indica en mis instrucciones UPDATE?

+0

primera declaración de actualización es redundante, establece todos los registros en 2 por 'valor predeterminado (2)' –

+0

Las declaraciones anteriores funcionó para mí. ¿Cómo los estás ejecutando? ¿Se ha creado la columna 'NewFieldName'? –

+0

@AmirIsmail mal. Cuando ejecuto la instrucción ALTER, se crea un campo, pero el predeterminado no está establecido para los registros existentes. Tal vez haya una manera diferente de escribir ALTER para hacer eso; pero la estructura actual no establece los valores predeterminados para las filas existentes. – ray

Respuesta

17

Necesita la declaración que hace referencia a la nueva columna que se compilará después de agregar la nueva columna. Una forma de hacerlo es ejecutarlo como un lote secundario con EXEC.

IF NOT EXISTS (SELECT * 
       FROM sys.columns 
       WHERE name = 'NewFieldName' 
         AND object_id = OBJECT_ID('dbo.MyTableName')) 
BEGIN 
    -- Add NewFieldName column to part of the Summer 2012 release cycle. 
    ALTER TABLE dbo.[MyTableName] 
      ADD [NewFieldName] SMALLINT NOT NULL 
      CONSTRAINT DF_MyTableName_NewFieldName DEFAULT (2) 

    EXEC(' UPDATE [MyTableName] SET NewFieldName = 1 WHERE [Name] = ''FindMe''') 
END 

La razón por la que trabajó para que originalmente es presumiblemente debido a la propia tabla no existía cuando el lote se compiló lo que significa por lo tanto que todas las declaraciones en que hacen referencia a la tabla están sujetos a la compilación diferido.

Cuestiones relacionadas