2010-04-06 81 views
4

我想寫一個DML腳本,更新一列,但我想,以確保第一列存在,所以我把它包在是否存在阻止UPDATE語句存在阻止

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Client' AND COLUMN_NAME='IsClarityEnabled') 
BEGIN 
    UPDATE Client SET IsClarityEnabled = 1 WHERE ClientID = 21 
END 

所以奇怪的是它試圖執行更新,即使它失敗的條件。所以列不存在,UPDATE語句運行,我得到一個錯誤。爲什麼?

即使奇怪的是,這樣做的工作:

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Client' AND COLUMN_NAME='IsClarityEnabled') 
BEGIN 
    EXEC('UPDATE Client SET IsClarityEnabled = 1 WHERE ClientID = 21') 
END 

有什麼特別之處,導致它的行爲這樣一個UPDATE命令?

+0

這個問題是否意味着您使用了清晰度?如果是這樣,我感到你的痛苦。 – HLGEM 2010-04-06 18:24:55

+0

是的,清晰度在這裏被使用。本身並不是那麼糟糕。 – ant 2010-04-06 19:57:29

回答

6

問題是,腳本將被編譯/解析,如果該列不存在,您將有一個編譯/解析錯誤。

列名無效 'IsClarityEnabled'。

+0

+1,你應該注意它在運行時不會編譯EXEC()中的字符串,所以它不會嘗試驗證尚不存在的列。 – 2010-04-06 17:22:20

+0

這是正確的,那是** Dynamic Sql **,您可能會發現引用了 – 2010-04-06 17:23:40

1

它試圖執行即使失敗條件

確定的更新?我懷疑實際發生的事情是SQL Server試圖解析UPDATE,無論條件的值如何。由於解析發生在執行之前,因此在解析時SQL Server無法'知道'您使用檢查保護了此UPDATE - 解析器只知道Client上沒有IsClarityEnabled列,因此它會發出抱怨。

EXEC的原因是因爲字符串文本沒有被解析器處理,因此需要謹慎。這是讓腳本必須運行的模式的標準方式,直到執行時間才知道。

+0

我認爲這是由於執行失敗,但它是解析器故障。 – ant 2010-04-06 17:41:43