2010-10-25 14 views
1

下面是一個SQL查詢的摘錄,我正在使用它將表更新爲正確的數據類型(如果需要)。ALTER TABLE執行而不考慮條件評估結果

If NOT Exists(Select * From Information_Schema.Columns 
    Where Table_Name = N'RXINFO' 
    And Table_Schema = N'scriptassist' 
    And Column_Name = N'LastChanged'  
    And DATA_Type = N'TIMESTAMP' 
    AND IsNull(CHARACTER_MAXIMUM_LENGTH, 0) = 0) 
    BEGIN 
     Print 'LastChanged Field needed type updating' 
     Alter Table [scriptassist].[RXINFO] Alter Column LastChanged TIMESTAMP 
    END 

目前的問題如下:

如果我在運行該語句使用ALTER TABLE當前的SQL Server在我拋出這個錯誤。

消息4927,級別16,狀態1,行12 無法將列'LastChanged'更改爲數據類型時間戳。

問題不是它不能改變數據類型問題是它試圖執行那個代碼塊而不管條件的評估。 在這種情況下,它應該評估爲False。

如果我把它拿出來,什麼都不會發生,印刷聲明甚至不會引發火災。

我到目前爲止唯一能想到的就是MS SQL事先評估SQL並確定是否所有代碼路徑都可以執行,並且因爲它們不能引發錯誤。然而這並沒有多大意義。

+0

在SQL Server 2008 R2上運行相同的代碼時,我沒有收到任何錯誤。 你說它*應該*評估爲false。您是否將您的選擇標準拉出以確保它返回結果? – 2010-10-25 18:55:45

+0

@mootinator,是的,我做到了。 – msarchet 2010-10-25 18:57:30

回答

4

SQL Server在執行它之前會解析您的SQL。分析過程中出現錯誤。

要延遲解析,直到該行實際運行,使用EXEC:

exec ('Alter Table [scriptassist].[RXINFO] Alter Column LastChanged TIMESTAMP') 
+0

完美謝謝。 – msarchet 2010-10-25 18:54:08

+0

我剛測試過這個,你仍然會得到同樣的錯誤。請參閱[我的答案](http://stackoverflow.com/questions/4017731/alter-table-executing-regardless-of-condition-evaluational-results/4017902#4017902)。 – 2010-10-25 19:04:49

+0

@Joe Stefanelli說得很好。 Exec()解決方案可防止ALTER COLUMN代碼在不應運行時進行評估。 BOL說ALTER列「type_name不能是時間戳」 - http://msdn.microsoft.com/en-us/library/ms190273.aspx – KenJ 2010-10-25 19:34:47

2

我相信你得到這個錯誤,因爲SQL不能從您的時間戳列以前的數據類型爲一個實際的時間戳進行轉換數據類型。您需要刪除,然後添加列。

If NOT Exists(Select * From Information_Schema.Columns 
    Where Table_Name = N'RXINFO' 
    And Table_Schema = N'scriptassist' 
    And Column_Name = N'LastChanged'  
    And DATA_Type = N'TIMESTAMP' 
    AND IsNull(CHARACTER_MAXIMUM_LENGTH, 0) = 0) 
    BEGIN 
     Print 'LastChanged Field needed type updating' 
     Alter Table [scriptassist].[RXINFO] Drop Column LastChanged 
     Alter Table [scriptassist].[RXINFO] Add LastChanged TimeStamp 
    END 
+0

+1我的答案是防範不存在的列,但這是沒有意義的重新閱讀這個問題。 – Andomar 2010-10-25 19:58:31