将列添加到默认值等于现有列的值的表中

如何将列添加到默认值等于现有列的值的SQL Server表?

我试过这个T-SQL语句:

ALTER TABLE tablename ADD newcolumn type NOT NULL DEFAULT (oldcolumn) 

但它给出了一个错误:

在这种情况下不允许使用名称“oldcolumn”。 有效expression式是常量,常量expression式和(在某些上下文中)variables。 列名是不允许的。

尝试这个:

 ALTER TABLE tablename ADD newcolumn type NOT NULL DEFAULT (0) Go Update tablename SET newcolumn = oldcolumn Where newcolumn = 0 Go 

我不太喜欢他们,但是这里是你如何使用AFTER INSERT触发器来做到这一点:

 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 

由于额外的UPDATE语句, AFTER INSERT触发器方法涉及开销。 我build议使用INSTEAD OF INSERT触发器,如下所示:

 CREATE TRIGGER tablename_on_insert ON tablename INSTEAD OF INSERT AS INSERT INTO tablename (oldcolumn, newcolumn) SELECT oldcolumn, ISNULL(newcolumn, oldcolumn) FROM inserted 

如果oldcolumn列是自动标识列,这不起作用。

为了扩展Kapil的答案,并避免不必要的默认约束,试试这个:

 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 

如果你的types是varchar,nvarchar,datetime,或者其他types的任何兼容数据,用'noData'replace-9999:具体的值不重要,它将被第二条指令擦除。

我认为这将工作,如果您使用Set Identity_Insert <TableName> OFF并在您写的插入语句后使用Set Identity_Insert <TableName> ON