¿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 Gofuente
No me gustan mucho, pero así es como puedes hacer esto con un
AFTER INSERTdisparador: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 tablefuente
El
AFTER INSERTenfoque de activación implica gastos generales debido a laUPDATEdeclaración adicional . Sugiero usar unINSTEAD OF INSERTdisparador, 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 insertedSin embargo, esto no funciona si
oldcolumnes una columna de identidad automática.fuente
INSTEAD OFlos disparadores tampoco funcionan cuando se usan tablas temporales:SYSTEM_VERSIONING = ONPara 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 GoReemplace -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> OFFy después de insertar la Declaración que escribió, simplemente useSet Identity_Insert <TableName> ON.fuente