Добавление большего контекста к моему комментарию: "Чтобы повлиять на столбец (например, INSERT
в него, добавить расширенное свойство и т. Д., И т. Д.), Он должен быть в другом пакете. Даже фиксация транзакции выигранане изменяйте это. До того, как этот пакет будет завершен, вы не сможете делать "вещи" для этого столбца. DB <> Fiddle"
Мое утверждение на самом делездесь не так. Причина, по которой вы получаете ошибку, заключается в том, что пакет, в который был добавлен столбец, а затем попытался вставить его (или добавить CONSTRAINT
), фактически завершился неудачей. Компилятор анализирует SQL и видит, что вы пытаетесь INSERT
вставить (добавить CONSTRAINT
в) столбец, который в настоящее время не существует, и поэтому не удается.
Взятьэтот пример:
CREATE TABLE dbo.MyTable (ID int);
GO
ALTER TABLE dbo.MyTable ADD MyColumn int DEFAULT (100);
INSERT INTO dbo.MyTable
VALUES(1,100);
Сбой с ошибкой ниже:
Имя столбца или количество предоставленных значений не соответствует определению таблицы.
Однако если вы назовете столбцы, вы получите другую ошибку:
ALTER TABLE dbo.MyTable ADD MyColumn int DEFAULT (100);
INSERT INTO dbo.MyTable (ID, MyColumn)
VALUES(1,100)
Неверное имя столбца 'MyColumn'.
Для SP sp_addextendedproperty
, однако,проверка существования столбца откладывается до выполнения SP;в этот момент столбец будет существовать. Если вы попробуете следующее, вы не получите сообщение об ошибке:
CREATE TABLE dbo.MyTable (ID int);
GO
ALTER TABLE dbo.MyTable ADD MyColumn int DEFAULT (100);
EXEC sp_addextendedproperty @name = N'MS_Description', @value = 'texttexttext',
@level0type = N'Schema', @level0name = 'dbo',
@level1type = N'Table', @level1name = 'MyTable',
@level2type = N'Column', @level2name = 'MyColumn';
GO
INSERT INTO dbo.MyTable (ID, MyColumn)
VALUES(1,100)
GO
DROP TABLE dbo.MyTable;
Что касается вашего CONSTRAINT
, то возникнет та же проблема, что и INSERT
. Он должен быть в отдельном пакете.
Один из способов сделать это - отложить компиляцию оператора, добавив также CONSTRAINT
, используя sp_executesql
:
ALTER TABLE schema.MyTable ADD MyNewColumn INT DEFAULT(-7777);
EXEC sp_executesql N'ALTER TABLE schema.MyTable ADD CONSTRAINT CHK_MyTable_MyNewColumn CHECK(MyNewColumn IN(1, 2, 3, 4, 5));';