2011-03-31 59 views
2

錯誤我們有一個腳本,必須允許被重新運行幾次。SQL腳本運行良好的一個數據庫,在另一

我們有一個MS-SQL腳本,用於在存在(現在已過時)列的情況下更新表,然後刪除該列。爲確保腳本可以多次運行,它在執行更新之前首先檢查是否存在列。

該腳本按照我們的開發數據庫中的預期工作,在第一次運行時更新數據,然後在隨後的運行中顯示消息「不更新」。

在我們的測試數據庫上,腳本在第一次運行時運行正常,但在後續運行中出現「無效列名'OldColumn'」的錯誤;如果我註釋掉UPDATE和ALTER語句,它按預期運行。

即使存在潛在的錯誤,或者是否與數據庫的設置有關,是否有強制腳本運行的方法? (手指交叉,我不看像一個完整的小白!)

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MyTable' AND COLUMN_NAME = 'OldColumn') 

    BEGIN 
     PRINT 'Updating and removing old column...' 
     UPDATE MyTable SET NewColumn='X' WHERE OldColumn=1; 
     ALTER TABLE MyTable DROP COLUMN OldColumn; 
    END 

ELSE 
    PRINT 'Not updating' 
GO 
+2

它刪除列,你不能弄清楚爲什麼它不更新你丟棄的列? – 2011-03-31 00:10:21

+0

@Randolph - 這根本不是OP的問題。在後續運行中,當列不存在時,代碼不會執行。他們問爲什麼非執行代碼在一個環境中導致編譯問題,而不是另一個環境中。 – 2011-03-31 00:45:38

+0

對,我和你在一起。對困惑感到抱歉。 – 2011-03-31 04:29:08

回答

1

這樣的工作,你身邊可以做

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MyTable' AND COLUMN_NAME = 'OldColumn') 
    BEGIN 
     PRINT 'Updating and removing old column...' 
     EXEC ('UPDATE MyTable SET NewColumn=''X'' WHERE OldColumn=1;'); 
     ALTER TABLE MyTable DROP COLUMN OldColumn; 
    END 

ELSE 
    PRINT 'Not updating' 
+0

exec sp_dbcmptlevel'dbname'displays'當前兼容性級別爲100.'對於這兩個數據庫 – cooman 2011-03-31 00:55:31

+0

@cooman - 是的,我剛開始懷疑自己的答案。只有在涉及不存在的**表**的情況下,該語句的彙編才應推遲。表格本身是否仍然存在於開發環境中? – 2011-03-31 00:59:37

+0

@Martin - 桌子肯定在那裏;如果我將更新更改爲「UPDATE MyTable SET NewColumn ='X';」並刪除DROP它正確顯示「不更新」消息 – cooman 2011-03-31 01:04:42

相關問題