Это обязательный вопрос. Код привязан к метаданным таблицы во время компиляции, и он не привязан поздно. Попробуйте использовать EXEC и динамический SQL, чтобы преодолеть это ограничение:
BEGIN TRANSACTION;
PRINT 'Adding column, ''SupplementalDividends'', to MyTable table.';
ALTER TABLE MyTable
ADD SupplementalDividends DECIMAL(18,6);
PRINT 'Column added successfully....';
PRINT 'Ready to INSERT into MyTable ...';
EXEC('
INSERT INTO MyTable (x, SupplementalDividends)
VALUES (1, 3.2);
')
PRINT '**** CHANGES COMPLETE -- COMMITTING.';
COMMIT TRANSACTION;
Другой вариант - использование хранимой процедуры для вставки данных: поздняя привязка применяется к хранимой процедуре, но не к специальным запросам. Опять же, вам придется использовать динамический SQL для создания процедуры, но это может упростить передачу параметров:
BEGIN TRANSACTION;
PRINT 'Adding column, ''SupplementalDividends'', to MyTable table.';
ALTER TABLE MyTable
ADD SupplementalDividends DECIMAL(18,6);
PRINT 'Column added successfully....';
PRINT 'Ready to INSERT into MyTable ...';
EXEC('
CREATE PROCEDURE insData @p1 int, @p2 DECIMAL(18,6)
AS
BEGIN
INSERT INTO MyTable (x, SupplementalDividends)
VALUES (@p1, @p2);
END')
EXEC InsData 1, 3.2;
PRINT '**** CHANGES COMPLETE -- COMMITTING.';
COMMIT TRANSACTION;
Временная хранимая процедура также будет работать:
BEGIN TRANSACTION;
PRINT 'Adding column, ''SupplementalDividends'', to MyTable table.';
ALTER TABLE MyTable
ADD SupplementalDividends DECIMAL(18,6);
PRINT 'Column added successfully....';
PRINT 'Ready to INSERT into MyTable ...';
EXEC('
CREATE PROCEDURE #insData @p1 int, @p2 DECIMAL(18,6)
AS
BEGIN
INSERT INTO MyTable (x, SupplementalDividends)
VALUES (@p1, @p2);
END')
EXEC #InsData 1, 3.2;
PRINT '**** CHANGES COMPLETE -- COMMITTING.';
COMMIT TRANSACTION;
schema.ObjectName. Хорошее начало для адаптации хорошей практики :-)