Я намагаюся виконати наступний код як частину міграції в транзакції, але код не працює, якщо я не встановлю GO
заява після ADD CONSTRAINT
заява:
ALTER TABLE T ADD C INT NULL
ALTER TABLE T ADD CONSTRAINT DF_T_C DEFAULT ((1)) FOR C
GO
UPDATE T SET C = DEFAULT
ALTER TABLE T ALTER COLUMN C INT NOT NULL
Якщо я вийду з GO
вислів я отримую таку помилку:
Недійсне ім'я стовпця "C".
Код, який виконує міграцію, не може впоратися з GO
заява, як я можу отримати це для роботи в рамках однієї транзакції?
Відповіді:
3 для відповіді № 1Ви можете використовувати EXEC
для проблемних висловлювань, щоб вони складалися як інша партія.
EXEC("UPDATE T SET C = DEFAULT;
ALTER TABLE T ALTER COLUMN C INT NOT NULL")
Але ви також можете це зробити
ALTER TABLE T ADD C INT NOT NULL CONSTRAINT DF_T_C DEFAULT ((1))
Замість того, щоб робити всі ці окремі кроки самостійно.
0 для відповіді № 2
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET XACT_ABORT ON;
BEGIN TRANSACTION;
ALTER TABLE T ADD C INT NULL;
ALTER TABLE T ADD CONSTRAINT DF_T_C DEFAULT ((1)) FOR C;
EXEC ("UPDATE T SET C = DEFAULT");
ALTER TABLE T ALTER COLUMN C INT NOT NULL;
COMMIT TRANSACTION;
-2 для відповіді № 3
Я закінчився цим, що робить все в одному твердженні:
ALTER TABLE T ADD C INT NOT NULL CONSTRAINT DF_T_C DEFAULT ((1)) WITH VALUES
Працює з SQL Server.