2012-04-22 36 views
15

Với SQL sau:Rắc rối cập nhật cột mới sau khi thêm nó

IF EXISTS (SELECT * FROM sys.columns WHERE name = 'NewFieldName' AND object_id = OBJECT_ID('dbo.MyTableName')) 
    RETURN 

-- Add NewFieldName column to part of the Summer 2012 release cycle. 
ALTER TABLE dbo.[MyTableName] ADD 
    [NewFieldName] SmallINT NOT NULL 
     CONSTRAINT DF_MyTableName_NewFieldName DEFAULT (2) 

UPDATE [MyTableName] SET NewFieldName = 1 WHERE [Name] = 'FindMe' --Update one specific value 

Tạo thông báo lỗi sau:

Msg 207, Level 16, State 1, Line 10 không hợp lệ tên cột ' NewFieldName '.

Tôi chắc rằng tôi thiếu một số thứ cơ bản, nhưng cố gắng đặt "GO" sau khi thay đổi làm cho UPDATE chạy mọi lúc và tôi không muốn làm điều đó.

Làm cách nào để cấu trúc câu lệnh này để kiểm tra xem cột có tồn tại hay không và nếu nó không thêm cột và sau đó đặt giá trị như được nêu trong báo cáo UPDATE của tôi?

+0

tuyên bố cập nhật đầu tiên là dự phòng, bạn đặt tất cả các bản ghi thành 2 theo 'mặc định (2)' –

+0

Các báo cáo ở trên phù hợp với tôi. Làm thế nào bạn thực hiện chúng? Cột 'NewFieldName' có được tạo không? –

+0

@AmirIsmail sai. Khi tôi chạy báo cáo ALTER, trường được tạo nhưng mặc định không được đặt cho các bản ghi hiện có. Có thể có một cách khác để viết ALTER để làm điều đó; nhưng cấu trúc hiện tại không đặt giá trị mặc định cho các hàng hiện có. – ray

Trả lời

17

Bạn cần tuyên bố tham chiếu cột mới sẽ được biên dịch sau khi cột mới được thêm vào. Một cách để làm điều này là chạy nó như một lô con với EXEC.

IF NOT EXISTS (SELECT * 
       FROM sys.columns 
       WHERE name = 'NewFieldName' 
         AND object_id = OBJECT_ID('dbo.MyTableName')) 
BEGIN 
    -- Add NewFieldName column to part of the Summer 2012 release cycle. 
    ALTER TABLE dbo.[MyTableName] 
      ADD [NewFieldName] SMALLINT NOT NULL 
      CONSTRAINT DF_MyTableName_NewFieldName DEFAULT (2) 

    EXEC(' UPDATE [MyTableName] SET NewFieldName = 1 WHERE [Name] = ''FindMe''') 
END 

Lý do ban đầu nó được làm việc vì có nghĩa là tất cả các báo cáo trong bảng tham chiếu đến bảng đều bị trì hoãn.

Các vấn đề liên quan