una tablas tabla sentencia requieren recreación realizado que puedo permite para nombre modificar los impedir guardar consulta columna cambios cambiar agregar sql sql-server tsql ddl

tablas - Nombre de columna no válido en la actualización del servidor SQL después de crear la columna



no se permite guardar los cambios los cambios que ha realizado requieren (2)

En este caso, puede evitar el problema agregando la columna como NOT NULL y configurando los valores de las filas existentes en una declaración según mi respuesta aquí .

Más generalmente, el problema es un problema de compilación / parse. SQL Server intenta compilar todas las declaraciones en el lote antes de ejecutar cualquiera de las declaraciones.

Cuando una declaración hace referencia a una tabla que no existe en absoluto, la declaración está sujeta a compilación diferida. Cuando la tabla ya existe, arroja un error si hace referencia a una columna no existente. La mejor manera de evitar esto es hacer el DDL en un lote diferente del DML.

Si tanto una declaración hace referencia a una columna no existente en una tabla existente como a una tabla no existente, el error puede o no lanzarse antes de que se aplace la compilación.

Puede enviarlo en lotes separados (por ejemplo, utilizando el separador de lotes GO en las herramientas del cliente) o realizarlo en un ámbito secundario que se compila por separado utilizando EXEC o EXEC sp_executesql .

El primer enfoque requerirá que refactorice su código como un IF ... no puede abarcar lotes.

IF NOT EXISTS(SELECT * FROM sys.columns WHERE Name = ''OPT_LOCK'' AND object_ID = Object_id(''REP_DSGN_SEC_GRP_LNK'')) BEGIN ALTER TABLE REP_DSGN_SEC_GRP_LNK ADD OPT_LOCK NUMERIC(10, 0) EXEC(''UPDATE REP_DSGN_SEC_GRP_LNK SET OPT_LOCK = 0''); ALTER TABLE REP_DSGN_SEC_GRP_LNK ALTER COLUMN OPT_LOCK NUMERIC(10, 0) NOT NULL END;

¿Alguien ve lo que está mal con este código para SQL Server?

IF NOT EXISTS(SELECT * FROM sys.columns WHERE Name = ''OPT_LOCK'' AND object_ID = Object_id(''REP_DSGN_SEC_GRP_LNK'')) BEGIN ALTER TABLE REP_DSGN_SEC_GRP_LNK ADD OPT_LOCK NUMERIC(10, 0) UPDATE REP_DSGN_SEC_GRP_LNK SET OPT_LOCK = 0 ALTER TABLE REP_DSGN_SEC_GRP_LNK ALTER COLUMN OPT_LOCK NUMERIC(10, 0) NOT NULL END;

Cuando ejecuto esto, me sale:

Msg 207, Nivel 16, Estado 1, Línea 3
Nombre de columna no válido ''OPT_LOCK''.

en el comando de actualización.

Gracias.


Para su información, puede reemplazar el IF NOT EXISTS con la función COL_LENGTH . Se necesitan dos parámetros,

  1. Nombre de la tabla y

  2. Columna que estás buscando

Si se encuentra la columna, devuelve el rango del tipo de datos de la columna Ex: Int (4 bytes), cuando no se encuentra, devuelve un valor NULL .

Por lo tanto, puede usar esto de la siguiente manera y también combinar 3 Estados en uno.

IF (SELECT COL_LENGTH(''REP_DSGN_SEC_GRP_LNK'',''OPT_LOCK'')) IS NULL BEGIN ALTER TABLE REP_DSGN_SEC_GRP_LNK ADD OPT_LOCK NUMERIC(10, 0) NOT NULL DEFAULT 0 END;

Lo hace más simple.