Đó là một vấn đề ràng buộc. Mã được ràng buộc với siêu dữ liệu của bảng tại thời điểm biên dịch và nó không bị ràng buộc muộn. Hãy thử sử dụng EXEC và SQL động để vượt qua giới hạn này:
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;
Một tùy chọn khác là sử dụng một thủ tục được lưu trữ để chèn dữ liệu: ràng buộc muộn áp dụng cho thủ tục được lưu trữ, nhưng không áp dụng cho các truy vấn đặc biệt. Một lần nữa, bạn sẽ phải sử dụng SQL động để tạo thủ tục, nhưng nó có thể giúp bạn dễ dàng truyền tham số hơn:
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;
Một thủ tục lưu trữ tạm thời cũng sẽ làm việc:
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
. Một khởi đầu tốt để thích nghi với thực tiễn tốt :-)