Ответ 1
Попробуйте следующее:
ALTER TABLE tablename ADD newcolumn type NOT NULL DEFAULT (0)
Go
Update tablename SET newcolumn = oldcolumn Where newcolumn = 0
Go
Как добавить столбец в таблицу SQL Server со значением по умолчанию, равным значению существующего столбца?
Я пробовал эту инструкцию T-SQL:
ALTER TABLE tablename
ADD newcolumn type NOT NULL DEFAULT (oldcolumn)
но он дает ошибку:
В этом контексте имя "oldcolumn" не разрешено. действительный выражениями являются константы, константные выражения и (в некоторых контексты). Имена столбцов не разрешены.
Попробуйте следующее:
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
В триггерном подходе AFTER INSERT
используются служебные данные из-за дополнительного оператора UPDATE
. Я предлагаю использовать триггер 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
Замените -9999 на "noData", если ваш тип - varchar, nvarchar, datetime,... или любые совместимые данные для других типов: конкретное значение не имеет значения, оно будет уничтожено второй инструкцией.
Вы можете использовать вычисляемый столбец для вставки нового столбца в таблицу на основе существующего значения столбца
ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn) PERSISTED;
ИЛИ, если вы хотите внести некоторые изменения в значение на основе существующего значения столбца, используйте
ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn * 1.5) PERSISTED;
Я думаю, что это сработает, если вы используете Set Identity_Insert <TableName> OFF
, и после того, как вы вписали выражение, которое вы написали, просто используйте Set Identity_Insert <TableName> ON
.