2011-07-21 44 views
2

當執行下面的腳本,我得到的錯誤:這個tsql有什麼問題?

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

任何人都可以解釋一下嗎?謝謝。

DROP TABLE ttt; 
CREATE TABLE ttt(a nvarchar) 

IF NOT EXISTS (SELECT * 
       FROM sys.columns 
       WHERE object_id = OBJECT_ID('dbo.ttt') 
         AND name = 'b') 
    AND EXISTS (SELECT * 
       FROM sys.columns 
       WHERE object_id = OBJECT_ID('dbo.ttt') 
         AND name = 'a') 
    BEGIN 

     ALTER TABLE [dbo].ttt ADD b NVARCHAR 

     UPDATE [dbo].ttt 
     SET  b = a 

     ALTER TABLE [dbo].ttt DROP COLUMN a 
    END 

回答

2

它試圖編譯所有這些語句是執行1日前:

ALTER TABLE [dbo].ttt ADD b NVARCHAR 

    UPDATE [dbo].ttt 
    SET  b = a 

    ALTER TABLE [dbo].ttt DROP COLUMN a 

(事實上,它試圖編譯整批,不只是這些語句,但關鍵仍然代表 - 它試圖編譯UPDATE,該列不存在)

當它試圖編譯UPDATE語句時,它查閱表元數據並正確地找到t該列不存在。

嘗試EXEC更新聲明。

EXEC('UPDATE [dbo].ttt 
    SET  b = a'); 

而且還等什麼俄德說,你可能想要的列(否則,則默認爲最沒有意義的數據類型不斷 - 一個nvarchar(1))指定大小


這個腳本絕對運行沒有錯誤:

​​
+0

我更改爲EXEC格式並得到相同的錯誤。 –

+1

@Yousui - 我只是將你的整個腳本複製到一個乾淨的服務器上,刪除頂部的drop table ttt,按照上面的指定更改'UPDATE'語句,並且沒有錯誤地運行它。這仍然是一樣的錯誤嗎?是否有批次的後續部分(您沒有向我們顯示)也引用了列b,這些部分將在更改發生之前進行編譯? –

+0

是的,它顯示完全相同的錯誤。 –

2

如果你把代碼放在存儲過程中,它應該可以工作。只需確保在創建過程時該表與列a和列b同時存在。然後,在創建過程之後,您可以刪除該表並對其進行測試。