Подтвердить что ты не робот

Добавьте столбец в таблицу со значением по умолчанию, равным значению существующего столбца

Как добавить столбец в таблицу SQL Server со значением по умолчанию, равным значению существующего столбца?

Я пробовал эту инструкцию T-SQL:

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

но он дает ошибку:

В этом контексте имя "oldcolumn" не разрешено. действительный выражениями являются константы, константные выражения и (в некоторых контексты). Имена столбцов не разрешены.

4b9b3361

Ответ 1

Попробуйте следующее:

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

Ответ 2

Мне они не очень нравятся, но вот как вы могли сделать это с помощью 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   

Ответ 3

В триггерном подходе 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 является столбцом автоидентификации.

Ответ 4

Чтобы расширить 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,... или любые совместимые данные для других типов: конкретное значение не имеет значения, оно будет уничтожено второй инструкцией.

Ответ 5

Вы можете использовать вычисляемый столбец для вставки нового столбца в таблицу на основе существующего значения столбца

ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn) PERSISTED;

ИЛИ, если вы хотите внести некоторые изменения в значение на основе существующего значения столбца, используйте

ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn * 1.5) PERSISTED;

Ответ 6

Я думаю, что это сработает, если вы используете Set Identity_Insert <TableName> OFF, и после того, как вы вписали выражение, которое вы написали, просто используйте Set Identity_Insert <TableName> ON.