2014-06-09 87 views
0

我正在使用SQL Server 2008 R2。我已經創造了一些遷移的一些SQL語句:如何忽略SQL Server 2008 R2中的「無效列名」錯誤

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='TableA' AND COLUMN_NAME='Status') 
BEGIN 
    UPDATE TableA 
    SET Status = 'Active' 
    WHERE Status IS NULL 
END 

現在,我已經從數據庫表TableA下降列Status

再次當我執行上述塊,雖然我已經把檢查該列是否存在,只有那麼就應該執行UPDATE聲明,它給了我錯誤

無效列名「狀態」

如何擺脫這個錯誤?

感謝

+0

另外我要求你爲這個問題建議一些合適的標題。 :) – Dev

回答

2

你需要把代碼在一個單獨的範圍/批運行:

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS 
      WHERE TABLE_NAME='TableA' AND COLUMN_NAME='Status') 
BEGIN 

    EXEC('UPDATE TableA SET Status=''Active'' WHERE Status IS NULL') 

END 

您目前的問題是,該系統希望到編譯你的一批代碼在執行它的任何部分之前。它不能編譯UPDATE聲明,因爲有一列缺少,所以它甚至沒有機會啓動執行的代碼,並考慮是否EXISTS謂詞返回true或false。

+0

按預期工作..!非常感謝.. :) – Dev

0

因爲INFORMATION_SCHEMA是視圖,而不是表您當前的SQL塊可能會失敗一些時間。另外,根據MSDN

Some changes have been made to the information schema views that break backward compatibility.

因此,我們不能依靠信息架構視圖

而是使用SYS.TABLES

IF EXISTS(SELECT 1 FROM SYS.COLUMNS 
       WHERE NAME = N'Status' AND OBJECT_ID = OBJECT_ID(N'TableA')) 
BEGIN 
    UPDATE TableA SET Status='Active' WHERE Status IS NULL 
END 
+0

問題是我希望SQL Server避免列名「狀態」是否存在與否。我已經放了一個檢查,如果存在的列,那麼只有它應該執行該塊。此時「狀態」列不存在,因此「UPDATE」語句不會被執行。仍然我收到錯誤「無效的列名稱」。 – Dev