2012-05-18 165 views
0

我們升級了SQL數據庫中執行封閉在一個IF語句塊,並不斷有新列加入到升級版SQL試圖即使條件不滿足

例如表,

Table1Column1, Column2列。

在升級後的數據庫版本

,一個額外的列添加

Table1現在已經列Column1, Column2, Column3

我想創建一個腳本,可以在兩個版本。這個腳本是這樣的:

DECLARE @DBVersion varchar(25) 

select @DBVersion = (select DBVersion from DBVersions) 

IF @DBVersion = 'Old' 
    BEGIN 
    INSERT Table1 (Column1, Column2) 
    SELECT Value1, Value2 
    FROM TempTable 
    END 

IF @DBVersion = 'New' 
    BEGIN 
    INSERT Table1 (Column1, Column2, Column3) 
    SELECT Value1, Value2, Value3 
    FROM TempTable 
    END 

當我運行在舊的數據庫版本的劇本,我得到一個錯誤

無效列名「欄3」

我想,這是因爲SQL在執行之前編譯腳本並且無法找到 有沒有一種方法可以解決此問題並開發可在兩個數據庫版本中運行的腳本?

非常感謝

+0

不確定您正在使用哪種RDBMS,但這會有所幫助。另外,你確定你正在做一個正確的平等嗎?也就是說,有些語言使用'=='進行比較。當然,因爲我不知道你的RDBMS或語言,所以我不知道。 – Marc

+2

有沒有這樣的事情作爲一個** SQL數據庫** --- SQL只是*結構化查詢語言* - 許多數據庫系統使用的語言 - SQL不是數據庫產品...我們真的需要知道什麼數據庫系統(以及您使用的是哪個版本).... –

+0

該語句未執行。引擎試圖解析腳本中的名稱並失敗,因此出現錯誤。 (名稱解析發生在腳本執行之前。)要解決它,請使用@ Thomas的建議。 –

回答

2

假設你正在使用SQL Server或Sybase,你需要使用動態SQL這一點。

Declare @Sql nvarchar(max); 

If @DBVersion = 'Old' 
    Set @Sql = 'Insert Table1(Column1, Column2) 
         Select Value1, Value2 
         From TempTable'; 
Else If @DBVersion = 'New' 
    Set @Sql = 'Insert Table1(Column1, Column2, Column3) 
         Select Value1, Value2, Value3 
         From TempTable'; 

exec (@Sql);