将列添加到默认值等于现有列的值的表中
如何将列添加到默认值等于现有列的值的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 。