¿Cómo agregar una columna a una tabla de SQL Server con un valor predeterminado que es igual al valor de una columna existente?
Probé esta declaración T-SQL:
ALTER TABLE tablename
ADD newcolumn type NOT NULL DEFAULT (oldcolumn)
pero está dando un error:
El nombre "columna antigua" no está permitido en este contexto. Las expresiones válidas son constantes, expresiones constantes y (en algunos contextos) variables. No se permiten los nombres de columna.
sql
sql-server-2008
dodos
fuente
fuente
UPDATE
, entonces, me temo.Respuestas:
Prueba esto:
ALTER TABLE tablename ADD newcolumn type NOT NULL DEFAULT (0) Go Update tablename SET newcolumn = oldcolumn Where newcolumn = 0 Go
fuente
No me gustan mucho, pero así es como puedes hacer esto con un
AFTER INSERT
disparador:CREATE TRIGGER TableX_AfterInsert_TRG ON TableX AFTER INSERT AS UPDATE TableX AS t SET t.newcolumn = t.oldcolumn FROM Inserted AS i WHERE t.PK = i.PK ; -- where PK is the PRIMARY KEY of the table
fuente
El
AFTER INSERT
enfoque de activación implica gastos generales debido a laUPDATE
declaración adicional . Sugiero usar unINSTEAD OF INSERT
disparador, de la siguiente manera:CREATE TRIGGER tablename_on_insert ON tablename INSTEAD OF INSERT AS INSERT INTO tablename (oldcolumn, newcolumn) SELECT oldcolumn, ISNULL(newcolumn, oldcolumn) FROM inserted
Sin embargo, esto no funciona si
oldcolumn
es una columna de identidad automática.fuente
INSTEAD OF
los disparadores tampoco funcionan cuando se usan tablas temporales:SYSTEM_VERSIONING = ON
Para extender la respuesta de Kapil y evitar la restricción predeterminada no deseada, intente esto:
ALTER TABLE tablename ADD newcolumn type NOT NULL CONSTRAINT DF_TMP_TABLENAME_NEWCOLUMN DEFAULT -9999 Go Update tablename SET newcolumn = oldcolumn Go ALTER TABLE tablename DROP CONSTRAINT DF_TMP_TABLENAME_NEWCOLUMN Go
Reemplace -9999 por 'noData' si su tipo es varchar, nvarchar, datetime, ... o por cualquier dato compatible para otros tipos: el valor específico no importa, será borrado por la segunda instrucción.
fuente
Puede usar la columna calculada para insertar una nueva columna en una tabla basada en un valor de columna existente
ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn) PERSISTED;
O, si desea realizar algunos cambios en el valor según el valor de la columna existente, utilice
ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn * 1.5) PERSISTED;
fuente
Para mi caso, quiero agregar una nueva columna única no nula llamada CÓDIGO, pero no sé sobre el valor en el momento de la creación. Establezco el valor predeterminado obteniendo un valor predeterminado de NewID () y luego actualizo más tarde.
ALTER TABLE [WIDGET] ADD [CODE] CHAR(5) NOT NULL DEFAULT(SUBSTRING(CONVERT(CHAR(36), NEWID()), 1, 5)) ALTER TABLE [dbo].[WIDGET] WITH CHECK ADD CONSTRAINT [UQ_WIDGET_CODE] UNIQUE ([CODE])
fuente
Creo que funcionará si usa
Set Identity_Insert <TableName> OFF
y después de insertar la Declaración que escribió, simplemente useSet Identity_Insert <TableName> ON
.fuente