2011-01-31 4 views
15

Tôi đang cố gắng thay đổi một bảng để thêm một cột mới, sau đó chèn một hàng mới vào nó.SQL Server 2000 - ALTER TABLE + INSERT INTO = Lỗi?

ALTER TABLE Roles ADD ModifiedDate DateTime; 
INSERT INTO Roles (Name, [Description], CreatedBy, BuiltIn, Created, ModifiedDate) 
    VALUES ('Name', 'Description', 0, 1, GETDATE(), GETDATE()) 

nhưng tôi nhận được:

Msg 207, Level 16, State 1, Line 1 
Invalid column name 'ModifiedDate'. 

khi tôi cố gắng để chạy SQL ở trên trong SQL Server Management Studio. Tôi nghĩ đây là lỗi Studio, không phải lỗi máy chủ. Nếu SQL được chạy, nó sẽ hoạt động như cột sẽ tồn tại tại thời điểm đó.

Làm cách nào để thêm cột mới vào bảng và sau đó chèn vào bảng đó?

phiên bản:

  • SQL Server 2000
  • SQL Server Management Studio 2008

Trả lời

18

Đúng như dự đoán. SQL Server không thực thi từng dòng một. Nó biên dịch và phân tích lô, và khi điều này xảy ra, cột không tồn tại.

Bạn cần phải tách 2 hành động như vậy

ALTER TABLE Roles ADD ModifiedDate DateTime; 
EXEC (' 
    INSERT INTO Roles (Name, [Description], CreatedBy, BuiltIn, Created, ModifiedDate) 
    VALUES (''Name'', ''Description'', 0, 1, GETDATE(), GETDATE()) 
') 

A "GO" là một dấu phân cách hàng loạt chỉ cho các công cụ của khách hàng và không được công nhận bởi máy chủ

+1

Có cách nào để tắt tính năng này không? Tôi có vấn đề này khoảng 20-30 mục trong tập tin SQL của tôi. cập nhật cơ sở dữ liệu từ phiên bản này sang phiên bản khác. – Justin808

+1

@ Justin808: Không phải không có SQL động hoặc GO. Đó là cách SQL Server tạo ra các kế hoạch thực hiện và là nền tảng cho cách nó hoạt động. Nó không phải là thủ tục/dòng theo dòng. – gbn

+0

+1 giải pháp của bạn theo cách của mình tốt hơn so với những gì tôi đăng. – Lamak

0

gì về transations?

BEGIN TRANSACTION; 
ALTER TABLE Roles ADD ModifiedDate DateTime; 
GO; 
COMMIT TRANSACTION; 

BEGIN TRANSACTION; 
INSERT INTO Roles (Name, [Description], CreatedBy, BuiltIn, Created, ModifiedDate) VALUES ('Name', 'Description', 0, 1, GETDATE(), GETDATE()); 
GO; 
COMMIT TRANSACTION;