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,
Nombre de la tabla y
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.